MongoError: cannot infer query fields to set, path 'users' is matched twice
MongoError: cannot infer query fields to set, path 'users' is matched twice
我正在使用猫鼬。我想用数组users
(包括userId1
、userId2
)创建一个文档chat
,如果找不到:
我是这样做的:
ChatModel.findOneAndUpdate(
{ users: { $all: [userId1, userId2] }},
{ $setOnInsert: {
users: [userId1, userId2]
}},
{ upsert: true })
.exec()
.catch(err => console.log(err));
但是我得到了错误:
MongoError: cannot infer query fields to set, path 'users' is matched
twice
这是 Chat
架构:
{
users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
createdAt: { type: Date, default: Date.now }
}
我怎样才能正确地做到这一点?谢谢
我以此为条件
{
"users": {
$all: [
{"$elemMatch": userId1},
{"$elemMatch": userId2}
]
}......
}
这个问题有一个解决方法:
db.foo.update({a:{$all:[{$elemMatch:{$eq:0}},{$elemMatch:{$eq:1}}]}},{$set:{b:1}},{upsert:true})
当 a
是同时包含 0 和 1 的数组时,这将匹配,否则它将更新。
我知道这已经有了答案,但希望能为其他人节省一些时间,我不得不这样做:
{
"users": {
$all: [
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId1) }},
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId2) }}
]
}......
}
对已接受答案的修改:
- 就像 Dave Howson 在他对已接受答案的评论中所说的那样,需要 $eq。
- mongoose.Types.ObjectId 是必需的,因为我猜我的模式实例上的 _id 属性 是一个字符串。
我正在使用猫鼬。我想用数组users
(包括userId1
、userId2
)创建一个文档chat
,如果找不到:
我是这样做的:
ChatModel.findOneAndUpdate(
{ users: { $all: [userId1, userId2] }},
{ $setOnInsert: {
users: [userId1, userId2]
}},
{ upsert: true })
.exec()
.catch(err => console.log(err));
但是我得到了错误:
MongoError: cannot infer query fields to set, path 'users' is matched twice
这是 Chat
架构:
{
users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
createdAt: { type: Date, default: Date.now }
}
我怎样才能正确地做到这一点?谢谢
我以此为条件
{
"users": {
$all: [
{"$elemMatch": userId1},
{"$elemMatch": userId2}
]
}......
}
这个问题有一个解决方法:
db.foo.update({a:{$all:[{$elemMatch:{$eq:0}},{$elemMatch:{$eq:1}}]}},{$set:{b:1}},{upsert:true})
当 a
是同时包含 0 和 1 的数组时,这将匹配,否则它将更新。
我知道这已经有了答案,但希望能为其他人节省一些时间,我不得不这样做:
{
"users": {
$all: [
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId1) }},
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId2) }}
]
}......
}
对已接受答案的修改:
- 就像 Dave Howson 在他对已接受答案的评论中所说的那样,需要 $eq。
- mongoose.Types.ObjectId 是必需的,因为我猜我的模式实例上的 _id 属性 是一个字符串。