如何在mongodb中查询未知数量的子域中的精确马赫数

时间:2015-10-13 18:20:13

标签: mongodb

我有一个文档可以包含未知数量的子文档的集合:

"agent_id": {
    "0":"1234",
    "1":"2234",...etc

如何在所有agent_id子字段中搜索完全匹配?

1 个答案:

答案 0 :(得分:0)

您需要动态创建一个对象,其属性是嵌入文档名称agent_id与点(。)和字段名称的串联,用引号括起来,如下所示:

var query = {
        "agent_id.0": "78343",
        "agent_id.1": "78343",
        "agent_id.2": "78343",
        "agent_id.3": "78343",
        ...
        "agent_id.n": "78343"
    }

创建对象的一种方法是使用 mapReduce 生成子文档密钥。以下演示了这种方法。在Map-Reduce操作中,agent_id子文档中的一组键生成到输出集合" collection_keys"然后用于生成 find() 查询表达式:

假设您填充样本集

db.collection.insert([
    {
        "agent_id": {
            "0":"1234",
            "1":"2234",
            "56":"8451",
            "74":"1475",
            "10":"1234"
        }
    },
    {
        "agent_id": {
            "5":"5874",
            "18":"2351" 
        }           
    } 
])

运行以下mapReduce操作

var mr = db.runCommand({
    "mapreduce" : "collection",
    "map" : function() {
        for (var key in this.agent_id) { emit(key, null); }
    },
    "reduce" : function(key, stuff) { 
        return null  
    }, 
    "out": "collection" + "_keys"
});

var query = { "$or": [] },
    value = "1234";
db[mr.result].distinct("_id").forEach(function (key){    
    var obj = {};
    obj["agent_id." + key] = value;
    query["$or"].push(obj)
});

printjson(query);

将产生:

{
    "$or" : [
        {
                "agent_id.0" : "1234"
        },
        {
                "agent_id.1" : "1234"
        },
        {
                "agent_id.10" : "1234"
        },
        {
                "agent_id.18" : "1234"
        },
        {
                "agent_id.5" : "1234"
        },
        {
                "agent_id.56" : "1234"
        },
        {
                "agent_id.74" : "1234"
        }
    ]
})

然后,您可以在 find() 查询中使用查询文档:

db.collection.find(query)

将产生结果:

/* 0 */
{
    "_id" : ObjectId("561d5312cd05efc95a1ea1f4"),
    "agent_id" : {
        "0" : "1234",
        "1" : "2234",
        "56" : "8451",
        "74" : "1475",
        "10" : "1234"
    }
}