我想实现这种结构。
{
_id: 1,
notes: [
// 0 - 99
[
{
_id: 1,
text: "lorem"
},
{
_id: 2,
text: "lorem"
}
// {...}
{
_id: 99,
text: "lorem"
}
],
// 100 - 199
[
{
_id: 100,
text: "lorem"
},
{
_id: 101,
text: "lorem"
},
// {...}
{
_id: 199,
text: "lorem"
}
]
]
}
如您所见,我有一组笔记,该笔记被100分割为多个块。我应该如何运行db.sample.update
,因此,如果块长度小于100,则会将其插入该块中,如果相等,那么它将创建另一个范围为(100-199)的块,以此类推其他块(200-299)?谢谢。
答案 0 :(得分:1)
在您的情况下,您会提出类似条件,例如“如果数组长度小于 n ,则推送新的块,否则创建新的Array并推送新的块”。
您可以分两个步骤进行操作:
尝试查找具有特定<_id>的文档,其中块中的元素少于n = 3个
db.getCollection("test001").update (
{_id: ObjectId("5b79353e737098b608de3002")},
{"$push": {"notes.$[v]": {_id: 6, text: "ok"} } },
{ "arrayFilters": [ {"v.3": {$exists: false}} ] }
)
这将$ push元素{_id:6,text:“ ok”},如果块(v.3)不存在,则基本上少于3个元素。
如果查询失败(因此不存在少于3个元素的数组),则必须$ push一个新的空数组并再次运行该代码。
我认为您不能通过一个原子查询来完成此过程,必须分两步进行。