0

我的文档结构如下

{
    "_id": {
        "$oid": "55ae24016fb73f6ac7c2d640"
    },
    "Name": "some name",
    "District": "some district",
    "Stories": [
        {
            "userId": "105304831528398207103",
            "story": "some story",
            "Likes": ["user id 1" ..... ],
            "_id": {
                "$oid": "55c055af1875b0002572cf94"
            }
        }
    ]
}

现在,当用户喜欢一个故事时,我想将他的用户 ID 添加到数组Likes

我尝试了以下代码

router.post("/NewStoryLike", function (req, res) {
    var mongo = require('mongodb');
    var db = require('monk');
    var ObjectID = mongo.ObjectID;
    req.db.get('clnTemple').findAndModify({
        query: { "_id": ObjectID(req.body.postId) ,"Stories._id": ObjectID(req.body.storyId) },
        update: { $addToSet: { Likes: req.body.userId } },
        upsert: true
    });
    res.send("Like Added");
});

它没有抛出任何错误,但它没有将用户 ID 添加到喜欢数组,而是在顶层添加一个喜欢,即添加到帖子级别

应该做出什么改变?

4

1 回答 1

3

所以使用嵌套数组对设计来说是个坏主意。这是因为您可以在 MongoDB 中进行数组更新的限制。如位置$更新运算符的文档中所述:

嵌套数组

位置 $ 运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为 $ 占位符的替换是单个值

但是,$push|$addToSet您实际匹配的唯一数组外部数组,因此匹配的“第一个”数组元素是完全可以的。只要您的命名正确:

req.db.get('clnTemple').findAndModify({
    { 
        "_id": req.body.postId ,
        "Stories._id": ObjectID(req.body.storyId),
    },
    { "$addToSet": { "Stories.$.Likes": req.body.userId } },
    { "new": true },
    function(err,doc) {
       // updted doc in here
    }
);

除此之外,您不应该真正使用嵌套数组,这会很好,因为它只是附加到匹配的“外部”数组的“内部”数组。

作为个人偏好,我对“喜欢”的建模更加不同且更加可靠。但这是另一个问题。

于 2015-08-04T10:19:24.263 回答