例如,当我有一个类似于单个集合条目中的评论结构时:
"comments": [
{
"id": 0,
"comments": []
},
{
"id": 1,
"comments": [
{
"id": 3,
"comments": [
{
"id": 5,
"comments": []
},
{
"id": 6,
"comments": []
}
]
}
]
},
{
"id": 2,
"comments": [
{
"id": 4,
"comments": []
}
]
}
]
有没有一种好方法可以将另一条评论推送到具有给定 id 值的评论?
由于模式的递归性质,这种结构对于动态查询/更新来说非常复杂。
在不知道消息的“深度”的情况下,没有“简单”的方法来实现您所要求的,如果您想保留当前的结构,我建议您向每条消息添加一个名为“深度”的新字段,通过提前了解这一点,可以更轻松地动态生成查询来更新正确的消息,如下所示:
const depth = 2
const id = 5
const queryKey = `${Array(depth + 1).join('comments.')}id`;
const query = {
[queryKey]: id
};
const updateKey = `${Array(depth + 1).join('comments.$')}[elem].comments`;
db.collection.updateOne(
query,
{
"$push": {
[updateKey]: {
id: "newId",
depth: depth + 1,
comments: []
}
}
},
{
arrayFilters: [
{
"elem.id": id
}
]
})
这将动态生成正确的查询来更新正确的子文档。