让我们举一个例子:
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还是很陌生,您能对此有所帮助吗?谢谢:)
答案 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。
如果您还有其他想法,请分享:)