复杂的mongodb文档搜索

时间:2016-05-06 14:46:25

标签: mongodb

我试图编写一个查询查询,其中其中一个密钥在查询运行时是未知的,例如在以下文档中我有兴趣返回文档,如果"设置"是的:

{
    "a": {
        "randomstringhere": {
            "setup": true
        }
    }
}

然而,我无法工作如何通配" randomstringhere"字段,因为它更改为集合中的每个文档。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

你无能为力。但您可以像

一样修改集合架构
{
    "a": [
        {
        "keyName": "randomstringhere",
        "setup": true
        },

        //...
    ]
}

你可以写查询来查看

{
    'a' : { $elemMatch: { setup: true } ,
}

答案 1 :(得分:0)

您无法通过单个查询执行此操作,与当前设计一样,您需要一种机制来获取所需的所有随机密钥,然后汇编使用 {{3如果您获得变量键名称列表,则运行

您可以使用 $or 进行操作的第一部分。以下mapreduce操作将填充一个名为collectionKeys的单独集合,其中所有随机键都作为_id值:

mr = db.runCommand({
    "mapreduce": "collection",
    "map" : function() {
        for (var key in this.a) { emit(key, null); }
    },
    "reduce" : function() { }, 
    "out": "collectionKeys"
})

要获取所有随机密钥的列表,请在生成的集合上运行distinct:

db[mr.result].distinct("_id")

示例输出

["randomstring_1", "randomstring_2", "randomstring_3", "randomstring_4", ...]

现在给出上面的列表,您可以通过创建一个将在循环中设置其属性的对象来组装您的查询。通常,您的查询文档将具有以下结构:

var query = {
    "$or": [
        { "a.randomstring_1.setup": true },
        { "a.randomstring_2.setup": true },
        { "a.randomstring_3.setup": true }
    ]
};

然后您可以在查询中使用

db.collection.find(query)

因此,使用上面的子文档键列表,您可以使用JavaScript的 Map-Reduce 方法动态构建上述内容:

mr = db.runCommand({
    "mapreduce": "collection", // your collection name
    "map" : function() { // map function
        for (var key in this.a) { emit(key, null); }
    },
    "reduce" : function() { }, // empty reducer that doesn't do anything
    "out": "collectionKeys" // output collection with results
})

var randomstringKeysList = db[mr.result].distinct("_id"),
    orOperator = randomstringKeysList.map(function (key){
        var o = {};
        o["a."+ key +".setup"] = true;
        return o;
    }),
    query = { "$or": orOperator };

db.collection.find(query);