我的收藏集rooms
中的文档具有以下结构:
{
"_id": { "$oid": "4edaaa4a8d285b9311eb63ab" },
"users": [
{
"userId": { "$oid": "4edaaa4a8d285b9311eb63a9" },
"unreadMessages": 0
},
{
"userId": { "$oid": "4edaaa4a8d285b9311eb63aa" },
"unreadMessages": 0
},
]
}
如果我知道第一个用户的unreadMessages
,我想增加第二个用户的ObjectId
(数组中索引为1的用户)。知道文档的_id
足以选择,但是为了更新,我需要能够引用其他用户,所以我也选择users
。我正在使用以下更新调用:
collections.rooms.update(
{
_id: ObjectId("4edaaa4a8d285b9311eb63ab"),
users: { // not first user
$elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}
},
{
// this should increment second user's unreadMessages,
// but does so for unreadMessages of first user
$inc: { "users.$.unreadMessages": 1 }
}
);
它增加第一个用户的unreadMessages
,而不是第二个用户。我想这是因为$ne
实际上匹配了第一个用户,显然这就是users.$
所指的内容。
如何修改此调用以使第二个用户的unreadMessages
递增?
答案 0 :(得分:2)
我认为你做的是正确的,除了围绕$ne查询约束的一点语法诵读困难。
所以你在哪里
users: { // not first user
$elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}
而不是你想要的
users: { // not first user
$elemMatch: { userId: { $ne: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}
如果每次我做同样的交换时我都有镍......我会有很多镍币。 :)
实际上,如果你想收紧一些东西,就不需要$ elemMatch,因为你只是约束匹配数组元素的一个属性。我认为你可以将整个查询标准归结为:
{
_id: ObjectId("4edaaa4a8d285b9311eb63ab"),
users.userId: { $ne : ObjectId("4edaaa4a8d285b9311eb63a9") }
}