如何在使用MongoDB聚合框架展开数组后投影数组索引

Rol*_*man 7 mongodb aggregation-framework

使用MongoDB聚合管道展开数组(http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind)时是否可以访问数组索引?

例如,假设我在集合"c"中展开此文档:

{_id: 1, elements: ["a", "b", "c"]}
Run Code Online (Sandbox Code Playgroud)

然后这个操作:

db.c.aggregate([
 {$unwind: "$elements"}
])
Run Code Online (Sandbox Code Playgroud)

将返回文件的光标:

[
 {_id: 1, elements: "a"},
 {_id: 1, elements: "b"},
 {_id: 1, elements: "c"}
]
Run Code Online (Sandbox Code Playgroud)

我想能够弄清楚"a"有索引0,"b"有索引1而"c"在展开前在原始数组中有索引"2".

如何在展开操作中投影数组索引?

Ala*_*405 12

新发布的MongoDB 3.2支持展开数组索引.

$unwind您可以传递一个包含字段的对象pathincludeArrayIndex包含数组索引的字段,而不是传递一个操作符的路径.

来自MongoDB官方文档:

{
  $unwind:
  {
    path: <field path>,
    includeArrayIndex: <string>,
    preserveNullAndEmptyArrays: <boolean>
  }
}
Run Code Online (Sandbox Code Playgroud)


Bat*_*eam 3

目前,使用聚合框架似乎无法实现这一点。有一个与之相关的未解决的未决问题:https://jira.mongodb.org/browse/SERVER-4588

作为解决方法,您可以使用 Map-reduce,其中 map 函数为每个数组元素分配一个索引。

var map = function(){
    for(var i=0;i<this.elements.length;i++){
    emit({"_id":this._id,"index":i},{"index":i,"value":this.elements[i]});
    }
}
Run Code Online (Sandbox Code Playgroud)