我有以下疑问:
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个文档的单个结果。换句话说,将结果合并为一个结果。知道怎么样?
答案 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
累加器参数中所有文档属性的替代方法。