MongoDB - 限制数组属性的响应?

时间:2014-08-01 12:12:05

标签: mongodb

我有一个MongoDB集合指标/

返回统计数据,例如:

/indicators/population

{
   id: "population"
   data : [
       {
       country : "A",
       value : 100
       },
       {
       country : "B",
       value : 150
       }
   ]
}

我希望能够限制对特定国家的回应。 MongoDB似乎不支持这个,所以我应该:

  1. 重新构建MongoDB集合设置,以通过本机find()
  2. 实现此目的
  3. 扩展我的API,以便在返回客户端
  4. 之前允许过滤数据数组
  5. 其他?

2 个答案:

答案 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"]}});