我有一个包含与
类似的文档的集合{
"senderName" : "John",
"receiverName" : "Doe"
}
我正在尝试对集合执行聚合操作,我想要一组名称(结合senderName
和receiverName
所以我有类似
的东西names:["John", "Doe"]
有没有办法通过Mongo聚合框架实现这一目标。另外,我很遗憾地遇到mongo 2.4来解决这个问题。
答案 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
方法是一个公平的论据。但是如果你需要在聚合的某个阶段使用它,那么你必须这样做。
你仍然可以这样做,就是这样。