【问题标题】:Create an Array From two Fields从两个字段创建一个数组
【发布时间】:2017-06-30 11:20:41
【问题描述】:

我有一个包含类似于

的文档的集合
{
   "senderName" : "John",
   "receiverName" : "Doe"
}

我正在尝试对我想要一组名称的集合执行聚合操作(它结合了 senderNamereceiverName

所以我有类似的东西

names:["John", "Doe"]

有没有办法通过 Mongo 聚合框架来实现这一点。另外,不幸的是,我一直坚持使用 mongo 2.4 来解决这个问题。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    在 MongoDB 的现代版本中,最有效的方法是将新字段简单地标记为数组。这是 MongoDB 3.2 允许的:

    db.collection.aggregate([
      { "$project": {
        "names": [ "$senderName", "$receiverName" ]
      }}
    ])
    

    使用 MongoDB 2.6 中引入的 $map 运算符可能是最简单的方法。它转换数组,这就是你基本上要做的事情:

    db.collection.aggregate([
        { "$project": {
            "names": { "$map": {
                "input": { "$literal": ["first","last"] },
                "as": "el",
                "in": { "$cond": [
                    { "$eq": [ "$$el", "first" ] },
                    "$senderName",
                    "$receiverName"
                ]}
            }}
        }}
    ])
    

    或者,您可以对不支持运算符但效率不高的早期版本执行类似的过程:

    db.collection.aggregate([
        { "$project": { 
            "senderName": 1,
            "receiverName": 1,
            "type": { "$const": [ "first", "last" ] }
        }},
        { "$unwind": "$type" },
        { "$group": {
            "_id": "$_id",
            "names": { "$push": { "$cond": [
                { "$eq": [ "$type", "first" ] },
                "$senderName",
                "$receiverName"   
            ]}}
        }}
    ])
    

    但是,由于在任何一种情况下,您都没有真正聚合任何内容,因此通过您的语言自己支持的操作在客户端代码中使用类似的 map 方法是一个公平的论点。但是,如果您需要在聚合的某个阶段使用它,那么您必须这样做。

    你仍然可以这样做,就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2019-01-26
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多