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

使用MongoDB聚合框架展开数组后如何投影数组索引,mongodb,aggregation-framework,Mongodb,Aggregation Framework,使用MongoDB聚合管道展开数组()时是否可以访问数组索引 例如,假设我在集合“c”中展开此文档: {u id:1,元素:[“a”、“b”、“c”]} 然后此操作: db.c.aggregate([ {$unwind:“$elements”} ]) 将返回文档的游标: [ {u id:1,元素:“a”}, {u id:1,元素:“b”}, {u id:1,元素:“c”} ] 我希望能够在展开之前计算出原始数组中“a”的索引为0,“b”的索引为1,“c”的索引为2 如何在展开操作中投影数组

使用MongoDB聚合管道展开数组()时是否可以访问数组索引

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

{u id:1,元素:[“a”、“b”、“c”]}
然后此操作:

db.c.aggregate([
{$unwind:“$elements”}
])
将返回文档的游标:

[
{u id:1,元素:“a”},
{u id:1,元素:“b”},
{u id:1,元素:“c”}
]
我希望能够在展开之前计算出原始数组中“a”的索引为0,“b”的索引为1,“c”的索引为2


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

目前,使用聚合框架似乎不可能做到这一点。有一个未解决的未解决问题链接到它:

作为一种解决方法,您可以使用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]});
    }
}
var map=function(){

对于(var i=0;i,新发布的MongoDB 3.2支持数组索引的展开

您可以传递带有字段
path
和字段
includearyaindex
的对象,而不是通过
$unwind
操作符传递路径,该字段将保存数组索引

发件人:

{
$REWIND:
{
路径:,
INCLUDEARAYINDEX:,
保留Null和EmptyArray:
}
}

谢谢!我觉得这是不可能的,因为我现在看到了示例,也没有找到任何操作符来投影索引。但是我还没有找到这个问题报告。谢谢!非常欢迎。操作符组合,
$let
$map
可以让我们接近项目操纵值,但由于它们的范围限制,增量索引无法实现。我知道使用map/reduce可以在map/reduce实现的范围内做任何事情。一直困扰我的一件事是如何确保map结果不会变得太大。关于手头的问题,我认为JIRA case提出了一种合理的方法来投影索引。到目前为止,我在学习查询MongoDB时遇到了一个非常陡峭的学习曲线。是否有可能在聚合中反转此操作?或者在MongoDB中投影数组的解决方案不可能,但代码已被接受。对不起,我的意思是反转
展开
@token。然而,简而言之:是的,这是可能的,例如,如果您展开字段
e元素
,然后你可以像这样把它组合起来
{$group:{{{u id:'$\u id',elements:{$push:'$elements'}}}}}}
。如果你能把它作为一个单独的问题(而不仅仅是一个注释)提交,那么我就可以在那里给出完整的答案了。
{
  $unwind:
  {
    path: <field path>,
    includeArrayIndex: <string>,
    preserveNullAndEmptyArrays: <boolean>
  }
}