我有一个具有以下架构的集合:
{
"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" }
]
}
答案 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"
}
}
}
]
})