复杂的Mongo查询,同时检查几个属性

时间:2015-11-17 16:45:19

标签: javascript mongodb meteor mongodb-query

以下是我的数据库的样子:

[
    {
        _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获得的字符串列表。

我的问题是我不知道如何对我的文档的单个属性/列表进行如此多的限制。当然,我可以用来改进我的搜索,但随着时间的推移它会非常昂贵,因为我的数据库增长得非常快。

有人可以指导我吗?

感谢。

1 个答案:

答案 0 :(得分:4)

Users.find({
  $or: [
    {
      languages: {
        $elemMatch: {
          lang: 'French',
          level: { $gte: 2 }
        },
      }
    },
    {
      languages: {
        $elemMatch: {
          lang: 'English',
          level: { $lte: 2 }
        }
      }
    }
  ]
}).fetch();