【问题标题】:Complex Mongo query, checking simultaneously on several attributes复杂的 Mongo 查询,同时检查多个属性
【发布时间】:2015-11-17 16:45:18
【问题描述】:

这是我的数据库的样子:

[
    {
        _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
    }
]

我的目标是建立一个查询,用这个例子:

  • 选择所有会说法语的用户,级别 >=

  • 且英语水平

  • 所选用户可以使用我不关心的其他语言

换句话说,我想构建一个查询来查找拥有列表中指定的所有语言的每个用户,每种语言都必须匹配级别比较才有效。

这有点难,因为我不习惯 MongoDB 中如此复杂的查询。

目前,我不是在寻找级别比较。我只是使用"profile.languages.lang" : { $all: languagesArray }languagesArray 查询匹配良好语言的用户,无论级别如何,我在比较对象列表中使用.map 获得的字符串列表。

我的问题是我不知道如何在我的文档的单个属性/列表上指定这么多的约束。当然,我可以抓取来优化我的搜索,但随着时间的推移,这将非常昂贵,因为我的数据库正在快速增长。

谁能指导我?

谢谢。

【问题讨论】:

    标签: javascript mongodb meteor mongodb-query


    【解决方案1】:
    Users.find({
      $or: [
        {
          languages: {
            $elemMatch: {
              lang: 'French',
              level: { $gte: 2 }
            },
          }
        },
        {
          languages: {
            $elemMatch: {
              lang: 'English',
              level: { $lte: 2 }
            }
          }
        }
      ]
    }).fetch();
    

    【讨论】:

    • 谢谢,真的比我想象的要简单!我将在下一个版本中节省大量时间 :)
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2013-03-20
    • 2018-05-12
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多