在MongoDB中查找并更新孩子的孩子

时间:2019-07-10 15:07:05

标签: node.js mongodb

让我们举一个例子:

listCollection = {
    id_list:"111",
    child_list:[{
        id_list:"222",
        child_list:[{
            id_list:"333",
            child_list:[{
                // and it can be more
            }]
        }]
    }]
}

如您所见,它始终是同一对象内的同一对象。初始对象是:

var list = {
    id_list: "string",
    child_list:[]
};

使用mongoDB,我只想知道id_list,即可在集合内的任何位置查找,更新或推送列表。 这是我最远的地方:

db.collection("listCollection").findOneAndUpdate({
    "child_list.id_list": "listId"
}, {
    "$push": {
        "child_list.$.child_list": newList
    }
}, function(err, success) {
    if (err) { 
        console.log(err); 
    } else { 
        console.log(success); 
    }
})

它对于第一级的孩子来说效果很好,但还不止于此。 我对Node JS + mongoDB还是很陌生,您能对此有所帮助吗?谢谢:)

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方法。不是一个真正漂亮的,而是一个工作的。

让我们重新举一个例子:

listCollection = {
    child_list:[{
        child_list:[{
            child_list:[

            ]
        }]
    }]
}

我想在层次结构的末尾添加一个新的child_list。最后,我希望我的收藏看起来像这样:

listCollection = {
    child_list:[{
        child_list:[{
            child_list:[{
                child_list:[

                ]
            }]
        }]
    }]
}

是的,这是一个愚蠢的例子,但它是一个简单的例子:) 所以这是我要插入的对象:

var theNewChildList= {
    child_list:[] 
};

然后,我将需要一种要放置NewChildList的“路线”。 在这里,我想将其推送到listCollection.child_list [0] .child_list [0] .child_list

所以我只使用该字符串:

var myRoute = "child_list.0.child_list.0.child_list";

然后,我像这样准备您的mongoDB查询:

var query = {};
query[myRoute] = theNewChildList;

最后,我进行查询:

db.collection("myCollectionOfList").findOneAndUpdate(
    {}, // or any condition to find listCollection
    {"$push": query},

    function(err, success) {
    if (err) { 
        console.log(err); 
    } else { 
        console.log(success); 
    }
})

它有效。 请注意,您可以通过多种方式动态地准备var myRoute。

如果您还有其他想法,请分享:)