猫鼬 - 推入物体的子阵列

时间:2016-02-29 12:19:39

标签: node.js mongodb mongoose

我的猫鼬物体:

{
    "_id" : "568ad3db59b494d4284ac191",
    "name" : "MyCompany",
    "description": "whatever"
    "items" : [ 
        {
            "_id" : "568ad3db59b494d4284ac19f",
            "fields" : {
                "Name" : "Item1",
                "Internal ID" : "ID00042",
                "tags" : [ 
                    {
                        "Description" : "Tag1",
                        "Level" : 2
                    }, 
                    {
                        "Description" : "Tag2",
                        "Level" : 3
                    }
                ]
            }
        },         {
            "_id" : "568ad3db59b494d4284ac19f",
            "fields" : {
                "Name" : "Item2",
                "Internal ID" : "ID00043",
                "tags" : [ 
                    {
                        "Description" : "Tag1",
                        "Level" : 5
                    }, 
                    {
                        "Description" : "Tag5",
                        "Level" : 1
                    }
                ]
            }
        }, {..}
    ]
}

我需要推送以下标签:

var obj = {
      "Description" : "myDescription",
      "Level" : 3
};

进入以下项目的标签数组:

var internal_id = "ID00102";

我的尝试无效:

Company.findOneAndUpdate(
    { "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },
    {
        "$push": {
            "tags": thetag
        }
    },
    function(err,doc) {
        if (err) res.status(500).send(err);
        return res.status(200).send(doc);
    }
);

2 个答案:

答案 0 :(得分:2)

$push运算符与更新中的 $ positional operator 一起应用,将标记对象添加到tags字段。 $ positional operator 将标识要更新的items数组中的正确元素,而不显式指定数组中元素的位置,因此您的最终更新语句应如下所示: / p>

Company.update(
    { "_id": "568ad3db59b494d4284ac191", "items.fields.Internal ID": internal_id },
    {
        "$push": {
            "items.$.fields.tags": thetag
        }
    }
)

答案 1 :(得分:0)

Company.findOneAndUpdate(
{ "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },
    {
        "$push": {
            "tags": thetag
        }
    },
    function(err,doc) {
        if (err) res.status(500).send(err);
        return res.status(200).send(doc);
    }
);

在上面的示例中:

{ "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },

MISSING' at" items.fields ['内部ID]"

在对象名称中包含空格并不是很好的做法,因为在" items.fields.Internal ID"中,它并不总是起作用并且给出了一些尴尬的问题。使用internalId只会让事情变得不那么尴尬。