查找与MongoDB中对象数组中的多个字段匹配的文档

时间:2014-08-02 16:34:33

标签: arrays mongodb find

假设我有一个对象数组(让我们称之为数组A),我需要一个查询来查找MongoDB中的一个集合,以查找与其中一个字段匹配的所有文档到数组A中对象1的一个属性另一个字段到数组A中同一对象中的某个其他属性。

文档没有数组A中对象的所有属性。

要明确......

数组A看起来像这样......

[{
    id_bus:1,
    id_bus_variation:13,
    ....
},{
    id_bus:2,
    id_bus_variation:184,
    ....
},{
    id_bus:3,
    id_bus_variation:13,
    ....
}]

我的数据库中的文档包含这两个属性,我需要同时匹配这两个属性。例如,我需要在我的数据库中找到包含id_bus == 1id_bus_variation == 13的文档,以及包含id_bus == 2id_bus_variation == 184但不包含id_bus == 4id_bus_variation == 13的文档。 1}}和{{1}}。

我真的不知道如何使用单个查询来做到这一点,我找到的唯一方法就是通过数组A并对每个元素执行查询,匹配我需要的所有字段,但这看起来效率不高。

2 个答案:

答案 0 :(得分:6)

听起来您希望将数组中子文档的结构与数组指定的许多可能结构之一进行匹配。我将举例说明如何在mongo shell中执行此操作:

> db.test.insert({ 
    "_id" : 0, 
    bus : [
        { "id_bus" : 1, "id_bus_variation" : 1 },
        { "id_bus" : 2, "id_bus_variation" : 2 },
        { "id_bus" : 3, "id_bus_variation" : 3 }
    ]
})
> db.test.insert({ 
    "_id" : 1, 
    bus : [
        { "id_bus" : 1, "id_bus_variation" : 3 },
        { "id_bus" : 2, "id_bus_variation" : 2 },
        { "id_bus" : 3, "id_bus_variation" : 1 }
    ]
})
> db.test.insert({ 
    "_id" : 2, 
    bus : [
        { "id_bus" : 1, "id_bus_variation" : 1 },
        { "id_bus" : 2, "id_bus_variation" : 3 },
        { "id_bus" : 3, "id_bus_variation" : 2 }
    ]
})

如果我们想要返回所有文档(id_bus = 2id_bus_variation = 3)或(id_bus = 3id_bus_variation = 3),则按照数组中的指定

> var match = [{ "id_bus" : 2, "id_bus_variation" : 3 }, { "id_bus" : 3, "id_bus_variation" : 3 }];

我们可以通过编程方式构建查询:

> var query = { "$or" : [] }
> for (var i = 0; i < match.length; i++) {
    query["$or"].push({ "bus" : { "$elemMatch" : match[i] } });
}
> db.test.find(query, { "_id" : 1 }) // just get _id's for easy reading
{ "_id" : 0 }
{ "_id" : 2 }

我们得到了预期的结果。

答案 1 :(得分:0)

我不知道我是否理解你的问题。

您的收藏可能就像

{
"_id" : ObjectId("53de54c1560b7815e123792f"),
"bus" : [ 
    {
        "id_bus" : 1,
        "id_bus_variation" : 13
    }, 
    {
        "id_bus" : 2,
        "id_bus_variation" : 184
    }, 
    {
        "id_bus" : 3,
        "id_bus_variation" : 13
    }
]

}

并且只有在id_busid_bus_variation为&#34; true&#34;

时才需要检索文档

你可以尝试一下

db.stack.find({$and:[{ "bus.id_bus" : 1,"bus.id_bus_variation" : 13},{"bus.id_bus" : 2,"bus.id_bus_variation" : 184}]})

并仅在bus.id_busbus.id_bus_variation位于文档中时检索文档。 例如

db.stack.find({$and:[{ "bus.id_bus" : 1,"bus.id_bus_variation" : 13},{"bus.id_bus" : 2,"bus.id_bus_variation" : 184},{"bus.id_bus":4}]})

你没有任何结果。

如果您想要完全符合Object

中的元素
db.stack.find ( { bus: { "$elemMatch" : { id_bus:1, id_bus_variation : 13} } }  )

只有当两个值均为&#34; true&#34;

时,才会返回文档