MongoDB。将嵌入式数组拆分为块

时间:2018-08-19 08:14:41

标签: mongodb

我想实现这种结构。

{
  _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)?谢谢。

1 个答案:

答案 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一个新的空数组并再次运行该代码。

我认为您不能通过一个原子查询来完成此过程,必须分两步进行。