我有一个MongoDB集合指标/
返回统计数据,例如:
/indicators/population
{
id: "population"
data : [
{
country : "A",
value : 100
},
{
country : "B",
value : 150
}
]
}
我希望能够限制对特定国家的回应。 MongoDB似乎不支持这个,所以我应该:
答案 0 :(得分:1)
这实际上是一个非常简单的操作,只需使用positional $
运算符进行“投影”以匹配给定条件。在“单数”匹配的情况下:
db.collection.find(
{ "data.country": "A" },
{ "data.$": 1 }
)
这将匹配数组中第一个元素,该元素与查询中给出的条件相匹配。
对于多个匹配,您需要调用MongoDB的聚合框架:
db.collection.agggregate([
// Match documents that are possible first
{ "$match": {
"data.country": "A"
}},
// Unwind the array to "de-normalize" the documents
{ "$unwind": "$data" },
// Actually filter the now "expanded" array items
{ "$match": {
"data.country": "A"
}},
// Group back together
{ "$group": {
"_id": "$_id",
"data": { "$push": "$data" }
}}
])
或使用MongoDB 2.6或更高版本,更清洁,或者至少没有$unwind
:
db.collection.aggregate({
// Match documents that are possible first
{ "$match": {
"data.country": "A"
}},
// Filter out the array in place
{ "$project": {
"data": {
"$setDifference": [
{
"$map": {
"input": "$data",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.country", "A" },
"$$el",
false
]
}
}
},
[false]
]
}
}}
])
答案 1 :(得分:0)
如果我对问题的理解还可以,那么你可以使用:
db.population.find({"population.data.country": {$in : ["A", "C"]}});