Mongodb Mongoose-查询Mongo对象数组,匹配搜索数组中的任何对象

Mongodb Mongoose-查询Mongo对象数组,匹配搜索数组中的任何对象,mongodb,mongoose,Mongodb,Mongoose,我有一个Mongo模式,其中包含两个对象数组,如下所示: genre: {Type: [Object]}, type: {Type: [Object]} Example Document Data: genre: [ {name: "scifi", selected: true}, {name: "fantasy", selected: false, {name: "western", selected: true}, ], type: [ {name: "module", selecte

我有一个Mongo模式,其中包含两个对象数组,如下所示:

genre: {Type: [Object]},
type: {Type: [Object]}

Example Document Data:
genre: [
{name: "scifi", selected: true}, 
{name: "fantasy", selected: false,
{name: "western", selected: true}, 
],
type: [
{name: "module", selected: true},
{name: "rulebook", selected: true},
{name: "artwork", selected: false},
]
我如何执行一个查询,该查询接收一系列类型/类型并返回任何匹配的文档

findGenres = [
    {name: "scifi", selected: true}, 
    {name: "western", selected: true}, 
]
findTypes = [
    {name: "rulebook", selected: true}
]

所以当我搜索时,它只会返回标有Scfi或western的规则书

为了更好地解释,让我们把这个查询切成两半

第1部分(已编辑) 要检查
流派
中单个对象的名称和选定项,可以使用此查询查找数组中的单个项:

model.find('genre':{“$elemMatch”:{name:“scfi”,selected:true}})

对于
类型

第二部分 由于要搜索的值不同,您可以在中使用
$查找不同值的所有匹配项

model.find({
    "$or": [
        {'genre': {"$elemMatch": {name: "scifi", selected: true} }},
        {'type': {"$elemMatch": {name: "rulebook", selected: true} }}
     ]
)}
第三部分 现在,您需要做的就是将
findGenres
findTypes
映射到第1部分中的同一个数组中,然后放入第2部分,就完成了


希望有帮助;)

为了更好地解释,让我们把这个查询切成两半

第1部分(已编辑) 要检查
流派
中单个对象的名称和选定项,可以使用此查询查找数组中的单个项:

model.find('genre':{“$elemMatch”:{name:“scfi”,selected:true}})

对于
类型

第二部分 由于要搜索的值不同,您可以在
中使用
$查找不同值的所有匹配项

model.find({
    "$or": [
        {'genre': {"$elemMatch": {name: "scifi", selected: true} }},
        {'type': {"$elemMatch": {name: "rulebook", selected: true} }}
     ]
)}
第三部分 现在,您需要做的就是将
findGenres
findTypes
映射到第1部分中的同一个数组中,然后放入第2部分,就完成了


希望有帮助;)

在第1部分中,您是否需要像这样使用
$elemMatch
类型:{$elemMatch:{name:{scfi],selected:true}}
否则,查询将与数组中至少有一个元素的
名称
为“scfi”的任何文档匹配以及至少一个元素,其中所选的
属性为
true
。(这里我关心的不一定是同一个元素)。因此,您希望结果中的
name
selected
都与您的查询匹配,对吗?我不是问这个问题的同一个Alex,但我假设Alex想这样做,是的。在第1部分中,您不需要像这样使用
$elemMatch
类型:{$elemMatch:{name:{scfi],selected:true}}
否则,查询将与数组中至少有一个元素的任何文档匹配,其中
名称
为“scfi”以及至少一个元素,其中所选的
属性为
true
。(这里我关心的不一定是同一个元素)。因此,您希望结果中的
name
selected
都与您的查询匹配,对吗?我不是问这个问题的同一个Alex,但我想Alex想这样做,是的。