以下是我的数据库的样子:
[
{
_id : xxx,
languages : [
{ lang: "French", level: 1 },
{ lang: "English", level: 3 },
{ lang: "Spanish", level: 4 }
]
},
{
_id : yyy,
languages : [
{ lang: "French", level: 5 },
{ lang: "English", level: 2 }
]
}
]
我有这样的清单:
[
{
lang : "French",
cmp : "at least",
level : 3
},
{
lang : "English",
cmp : "at most",
level : 2
}
]
我的目标是使用此示例构建一个查询:
选择所有使用级别> =
谁说英语的水平< = 2
所选用户可以使用我不关心的其他语言
换句话说,我想构建一个查询,查找列表中指定了所有语言的每个用户,每种语言必须匹配级别比较才有效。
这有点难,因为我不习惯在MongoDB中进行如此复杂的查询。
目前,我不是在寻找水平比较。我只是使用"profile.languages.lang" : { $all: languagesArray }
查询匹配好语言的用户,使用languagesArray
查询我在比较对象列表中使用.map获得的字符串列表。
我的问题是我不知道如何对我的文档的单个属性/列表进行如此多的限制。当然,我可以用来改进我的搜索,但随着时间的推移它会非常昂贵,因为我的数据库增长得非常快。
有人可以指导我吗?
感谢。
答案 0 :(得分:4)
Users.find({
$or: [
{
languages: {
$elemMatch: {
lang: 'French',
level: { $gte: 2 }
},
}
},
{
languages: {
$elemMatch: {
lang: 'English',
level: { $lte: 2 }
}
}
}
]
}).fetch();