因此,基本上,我需要使用自己的过滤器(即字符串数组)过滤数据,但问题是,确切的字段位于DB数组中的嵌套对象内部。因此,我的架构的一部分看起来像这样:
members: [
{
_id: { type: Schema.Types.ObjectId, ref: "Users" },
profilePicture: { type: String, required: true },
profile: {
firstName: { type: String },
lastName: { type: String },
occupation: { type: String },
gender: { type: String }
}
}
]
我的过滤器看起来像这样
gender: ["male","female"]
使用此过滤器的预期结果是得到一个既有男性用户又有女性用户的团队,如果它只有男性或女性,则不应给我该团队。但是我尝试过的一切都给了我一切,包括男性和女性,甚至只有男性成员。
我尝试过的方法:
db.teams.find(members: { $elemMatch: { "profile.gender": { $in: gender } } })
仅当在过滤器中指定了一种性别时,此方法才有效,嗯,我知道它一定不能在我要实现的目标上起作用,但我不知道如何实现。任何帮助将不胜感激
编辑:我已经尝试过以这种方式
db.teams.find({
$and: [
{ members: { $elemMatch: { "profile.gender": gender[0] } } },
{ members: { $elemMatch: { "profile.gender": gender[1] } } }
]
})
这仅在同时指定了两个过滤器的情况下才给我结果,但是,如果只有一个过滤器(“男性”或“女性”),则没有任何结果。
答案 0 :(得分:0)
使用$and运算符代替$ in。
db.teams.find(members: {$elemMatch: {$and: [{'profile.gender': 'male'}, {'profile.gender': 'female'}]}})
答案 1 :(得分:0)
无论您要比较多少个元素,此查询都有效
db.teams.find({$and: [{'members.profile.gender': 'male'}, {'members.profile.gender': 'female'}]})
如果要涵盖多个案例,则需要在将查询传递给find
之前动态生成查询。
答案 2 :(得分:0)
您可以使用$all
运算符来执行此操作,该运算符可以找到文档,其中包含所有指定元素的数组字段包含:
var gender = ['male', 'female'];
db.teams.find({'members.profile.gender': {$all: gender}});