使用$ ne查询后更新数组中的属性

时间:2011-12-03 23:18:48

标签: javascript mongodb increment database-update

我的收藏集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递增?

1 个答案:

答案 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") }
}