查询在mongodb中具有对象数组的嵌套对象

时间:2019-12-03 19:42:53

标签: node.js mongodb mongodb-query schema

我有一个具有以下架构的集合:

        {
            "id": "1",
            "properties": [
                { "key": "key1", "value": "8" },
                { "key": "key2", "value": "5" }
            ]
        },
        {
            "id": "2",
            "properties": [
                { "key": "key1", "value": "2" },
                { "key": "key2", "value": "5" }
            ]
        },
        {
            "id": "3",
            "properties": [
                { "key": "key1", "value": "9" },
                { "key": "key2", "value": "9" }
            ]
        },
        {
            "id": "4",
            "properties": [
                { "key": "key1", "value": "6" },
                { "key": "key2", "value": "5" }
            ]
        }
        // so on...

现在我有一个过滤器数组,例如,[{“ key”:“ key2”,“ value”:“ 5”},{“ key”:“ key1”,“ value”:“ 6”} ]。我希望我的回答如下,因为ID为1和2的两个objs在其属性字段中均具有{“ key”:“ key2”,“ value”:“ 5”}。且ID为4的obj是因为{“ key”:“ key1”,“ value”:“ 6”}。

由于所有内容都是如此嵌套的,因此最好的方法是什么?

        {
            "id": "1",
            "properties": [
                { "key": "key1", "value": "8" },
                { "key": "key2", "value": "5" }
            ]
        },
        {
            "id": "2",
            "properties": [
                { "key": "key1", "value": "2" },
                { "key": "key2", "value": "5" }
            ]
        },
        {
            "id": "4",
            "properties": [
                { "key": "key1", "value": "6" },
                { "key": "key2", "value": "5" }
            ]
        }

2 个答案:

答案 0 :(得分:1)

在寻找[{ "key": "key2", "value": "5" }, { "key": "key1", "value": "6" }]中带有至少一个匹配过滤器的文档时,只需尝试一下,一个简单的$or$in就可以在这里工作,以防万一需要两者都必须使用$elemMatch进行匹配:

db.getCollection('yourCollection').find({
    $or: [{
        properties: {
            "key": "key1",
            "value": "8"
        }
    }, {
        properties:
        {
            "key": "key2",
            "value": "5"
        }
    }]
})

已更新新要求,因为您可以直接传递以下对象(如果您需要至少匹配一个对象,则可以使用)$in

let arrayFilters = [{
    "key": "key1",
    "value": "8"
}, {
    "key": "key2",
    "value": "5"
}]

db.getCollection('yourCollection').find({ properties: { $in: arrayFilters } })

新要求是获取文档,其中属性数组应包含所有通过的过滤器(对象)而不是至少一个,然后使用$all

let arrayFilters = [{
    "key": "key1",
    "value": "8"
}, {
    "key": "key2",
    "value": "5"
}]
db.getCollection('yourCollection').find({ properties: { $all: arrayFilters } })

答案 1 :(得分:0)

根据您的过滤器要求,您必须使用$elemMatch (query)并执行以下查询:

jar

以上查询的输出:

db.getCollection('collectionName').find({
    $or: 
    [
        {
            properties: 
                { 
                    $elemMatch: {
                        "key": "key1",
                        "value": "8"
                    }
            }
        },
        {
            properties: 
                { 
                    $elemMatch: {
                        "key": "key2",
                        "value": "5"
                    }
                }
        }
    ]
})