查找其数组字段包含MongoDB中的一些子集的文档

时间:2016-01-23 21:41:55

标签: arrays mongodb

“users”集合包含带有数组字段的文档。

示例文件:

{
    "_id" :1001,
    "properties" : ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
}
{
    "_id" : 1002,
    "properties" : ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}

如何构建查询以获取符合下一个条件的文档? 仅获取具有以下属性的文档:

[ "3" AND ("A" OR "1") AND ("B" OR "2") ] 

或以其他方式:

    "3" AND "A" AND "B"
OR
    "3" AND "A" AND "2"
OR
    "3" AND "1" AND "B"
OR
    "3" AND "1" AND "2" 

在前面的示例中,查询必须仅生成文档:

{
    "_id" : 1002,
    "properties" : ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}

该系列有400万份文件。文档数组“properties”字段的平均长度为15个元素。我正在寻找的查询必须在这个相当大的集合中具有良好的性能。

2 个答案:

答案 0 :(得分:2)

试试这个:

db.users.find(
    {
        $or: [
            {$and: [{ "properties": "3" }, { "properties": "A" }, { "properties": "B" }]},
            {$and: [{ "properties": "3" }, { "properties": "A" }, { "properties": "2" }]},
            {$and: [{ "properties": "3" }, { "properties": "1" }, { "properties": "B" }]},
            {$and: [{ "properties": "3" }, { "properties": "1" }, { "properties": "2" }]}
        ]
    }
);

db.users.find(
    {
        $and: [
            {"properties": "3" },
            {$or: [ { "properties": "A" }, { "properties": "1" } ]},
            {$or: [ { "properties": "B" }, { "properties": "2" } ]}
        ]
    }
);

答案 1 :(得分:1)

斯蒂芬的回答没问题。使用$in$all运算符实现结果的其他方法:

db.users.find(
    {
    $and:[
        {"properties":"3"},
        {"properties" : {$in: ["A", "1"]}},
        {"properties" : {$in: ["B", "2"]}}
    ]
    }
);

(您对该子集的第一次描述的翻译)

db.users.find(
    {
       $or: [
        {"properties" : {$all: ["3", "A", "B"]}},
        {"properties" : {$all: ["3", "A", "2"]}},
        {"properties" : {$all: ["3", "1", "B"]}},
        {"properties" : {$all: ["3", "1", "2"]}}
    ]
    }
);

(对子集的第二次描述的翻译)

我担心我无法确定哪一个能确保最佳性能。我希望你有properties的索引。

您可以使用explain对较小的集合进行查询,以查看执行计划