从两个字段创建一个数组

时间:2015-03-05 01:17:18

标签: mongodb mongoose mongodb-query aggregation-framework

我有一个包含与

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

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

所以我有类似

的东西
names:["John", "Doe"]

有没有办法通过Mongo聚合框架实现这一目标。另外,我很遗憾地遇到mongo 2.4来解决这个问题。

1 个答案:

答案 0 :(得分:2)

在MongoDB的Modern版本中,最有效的方法是简单地将新字段标记为数组。 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方法是一个公平的论据。但是如果你需要在聚合的某个阶段使用它,那么你必须这样做。

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