【问题标题】:How to project array index after unwinding an array with MongoDB aggregation framework如何在使用 MongoDB 聚合框架展开数组后投影数组索引
【发布时间】:2014-12-27 01:07:00
【问题描述】:

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

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

{_id: 1, elements: ["a", "b", "c"]}

那么这个操作:

db.c.aggregate([
 {$unwind: "$elements"}
])

将为文档返回一个光标:

[
 {_id: 1, elements: "a"},
 {_id: 1, elements: "b"},
 {_id: 1, elements: "c"}
]

我希望能够在展开之前找出原始数组中“a”的索引为 0,“b”的索引为 1,而“c”的索引为“2”。

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

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

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

    您可以传递带有字段path 和字段includeArrayIndex 的对象,而不是传递$unwind 运算符的路径,该字段将保存数组索引。

    来自MongoDB official documentation

    {
      $unwind:
      {
        path: <field path>,
        includeArrayIndex: <string>,
        preserveNullAndEmptyArrays: <boolean>
      }
    }
    

    【讨论】:

    • 是否可以在聚合中反转此操作?或者投影数组的解决方案在 Mongodb 中是不可能的,但代码为 Accepted。抱歉,我的意思是颠倒unwind
    • @Tokenyet,很快:是的,有可能,例如如果你展开字段elements,那么你可以像{ $group: { _id: '$_id', elements: { $push: '$elements' } } } 一样将它组合回来。如果您可以将其作为单独的问题(而不仅仅是评论)提交,那就太好了,这样我就可以在那里给出完整的答案。
    【解决方案2】:

    目前这似乎无法使用聚合框架。有一个未解决的未解决问题与之相关: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]});
        }
    }
    

    【讨论】:

    • 谢谢!我的印象是这是不可能的,因为我现在看到了示例,也没有找到任何运算符来投影索引。但是我还没有找到这个问题报告。谢谢!
    • 不客气。运算符 $let$map 的组合可以使我们接近项目操纵值,但由于它们的范围限制,无法实现增量索引。
    • 我知道使用 map/reduce 几乎可以在 map/reduce 实现的范围内做任何事情。让我感到困惑的一件事是如何确保地图结果不会变得太大。关于手头的问题,我认为JIRA案例提出了一种合理的索引投影方式。到目前为止,我在学习查询 MongoDB 时经历了一段非常陡峭的学习曲线。
    猜你喜欢
    • 2019-10-23
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2013-07-31
    • 2015-09-08
    • 2015-09-12
    相关资源
    最近更新 更多