将单独的查询结果合并为一个结果

时间:2017-10-23 23:10:16

标签: mongodb mongodb-query aggregation-framework

我有以下疑问:

db.orders.find({ currency: 'ils' }).sort({ percent: -1 }).limit(1);
db.orders.find({ currency: 'usd' }).sort({ percent: -1 }).limit(1);
db.orders.find({ currency: 'eur' }).sort({ percent: -1 }).limit(1);

我希望获得这些查询产生的3个文档的单个结果。换句话说,将结果合并为一个结果。知道怎么样?

1 个答案:

答案 0 :(得分:2)

使用.aggregate()$group$first一起使用,前面有$sort

db.orders.aggregate([
  { "$match": { 
    "currency": { "$in": [ "ils", "usd", "eur" ] }
  }},
  { "$sort": { "currency": 1, "percent": -1 } },
  { "$group": {
    "_id": "$currency",
    "doc": {  "$first": "$$ROOT" }
  }}
])

如果需要,"doc"可选择$project$replaceRoot $project要求您明确"命名您想要的所有文档属性:

db.orders.aggregate([
  { "$match": { 
    "currency": { "$in": [ "ils", "usd", "eur" ] }
  }},
  { "$sort": { "currency": 1, "percent": -1 } },
  { "$group": {
    "_id": "$currency",
    "doc": {  "$first": "$$ROOT" }
  }},
  { "$replaceRoot": { "newRoot": "$doc" } }
])

对于单个属性参数,基本概念$in的工作方式类似于$or,并且实际上是"简写"对于较长的陈述。这样可以选择多个文档" any"所提供的价值而没有其他价值。

在" long"形成$or是有效的:

{
  "$or": [
    { "currency": "ils" },
    { "currency": "usd" },
    { "currency": "eur" }
  ]
}

所以你可以更清楚地看到它现在就像#34;写三个查询,因为你得到了#34;这个"或者"那"或者"另一个"作为选定结果的组成部分。

$sort和你正在做的很相似,除了你"前缀"通过"货币"考虑到你提取所有提供的,而不只是一个。

$first natuarally从分组边界获取第一个文档内容,即" currency"。我们可以提供$$ROOT作为单独命名$first累加器参数中所有文档属性的替代方法。