MongoDB多维数组投影

Hum*_*jät 5 multidimensional-array mongodb aggregation-framework

我刚开始学习MongoDB,无法找到解决问题的方法.

得到那个文件:

> db.test.insert({"name" : "Anika", "arr" : [ [11, 22],[33,44] ] })
Run Code Online (Sandbox Code Playgroud)

请注意"arr"字段是一个多维数组.

现在我正在寻找一个只返回arr [0] [1]值22的查询.我试图通过使用$ slice来实现它,但是我不知道如何使用它来解决第二个维度.

> db.test.find({},{_id:0,"arr":{$slice: [0,1]}})
{ "name" : "ha", "arr" : [ [ 11, 22 ] ] }
Run Code Online (Sandbox Code Playgroud)

我也试过了

> db.test.find({},{_id:0,"arr":{$slice: [0,1][1,1]}})
{ "name" : "ha", "arr" : [ [ 11, 22 ] ] }
Run Code Online (Sandbox Code Playgroud)

期望的输出也是

22
Run Code Online (Sandbox Code Playgroud)

要么

{"arr":[[22]]}
Run Code Online (Sandbox Code Playgroud)

谢谢


编辑:

阅读评论后,我认为我已经过多地简化了示例数据,我必须提供更多信息:

  1. 该集合中有更多文档,就像我提供的文档一样.但它们都具有相同的结构.
  2. 有两个以上的数组元素
  3. 在现实世界中,数组包含非常长的文本(500kb-1mb),因此将整个数据传输到客户端非常容易.
  4. 在聚合之前,我将通过'name'字段进行查询.为了简单起见,在示例中跳过了它.
  5. 目标索引是可变的,所以有时我需要知道arr [0] [1]的值,下次是arr [1] [4]

示例数据:

> db.test.insert({"name" : "Olivia", "arr" : [ [11, 22, 33, 44],[55,66,77,88],[99] ] })
> db.test.insert({"name" : "Walter", "arr" : [ [11], [22, 33, 44],[55,66,77,88],[99] ] })
> db.test.insert({"name" : "Astrid", "arr" : [ [11, 22, 33, 44],[55,66],[77,88],[99] ] })
> db.test.insert({"name" : "Peter",  "arr" : [ [11, 22, 33, 44],[55,66,77,88],[99] ] })
Run Code Online (Sandbox Code Playgroud)

示例查询:

> db.test.find({name:"Olivia"},{"arr:"...})
Run Code Online (Sandbox Code Playgroud)

Dmy*_*nko 4

您可以使用聚合框架:

db.test.aggregate([
    { $unwind: '$arr' },
    { $limit: 1 },
    { $project: { _id: 0, arr: 1 } },
    { $unwind: '$arr' },
    { $skip: 1 },
    { $limit: 1 }
])
Run Code Online (Sandbox Code Playgroud)

返回:

{ "arr": 22 }
Run Code Online (Sandbox Code Playgroud)

编辑:原始海报修改了我的解决方案以满足他的需求,并提出了以下内容:

db.test.aggregate([
    { $match: { name:"Olivia" } },
    { $project: { _id: 0,arr: 1 } },
    { $unwind: '$arr' },
    { $skip: 1 },
    { $limit:1 },
    { $unwind: "$arr" },
    { $skip: 2 },
    { $limit: 1 }
])
Run Code Online (Sandbox Code Playgroud)

该查询将给出{ arr: 77 }OP 提供的扩展数据。请注意,需要 $skip 和 $limit 来选择数组层次结构中的正确元素。