我使用猫鼬。我想创建一个文档chat
与数组users
(包括userId1
, userId2
),如果我找不到它:
我是这样做的:
ChatModel.findOneAndUpdate(
{ users: { $all: [userId1, userId2] }},
{ $setOnInsert: {
users: [userId1, userId2]
}},
{ upsert: true })
.exec()
.catch(err => console.log(err));
但是我得到了错误:
MongoError:无法推断要设置的查询字段,路径'users'匹配两次
这是Chat
Schema:
{
users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
createdAt: { type: Date, default: Date.now }
}
我怎样才能做得正确?由于
我用这个作为条件
{
"users": {
$all: [
{"$elemMatch": userId1},
{"$elemMatch": userId2}
]
}......
}
我知道这个问题已经有答案了,但是为了节省别人的时间,我不得不这样做:
{
"users": {
$all: [
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId1) }},
{ $elemMatch: { $eq: mongoose.Types.ObjectId(userId2) }}
]
}......
}
对接受答案的修改:
- 就像Dave Howson在他对被接受的答案的评论中所说的那样,$eq是需要的。
- mongoose.Types。ObjectId是需要的,因为我猜我的模式实例上的_id属性是一个字符串。
这个问题有一个解决方法:
db.foo.update({a:{$all:[{$elemMatch:{$eq:0}},{$elemMatch:{$eq:1}}]}},{$set:{b:1}},{upsert:true})
当a
是一个同时包含0和1的数组时,它将匹配,否则它将反转。
从https://jira.mongodb.org/browse/server - 13843 - ?focusedcommentid=2305903&页面= com.atlassian.jira.plugin.system.issuetabpanels: comment-tabpanel #评论- 2305903