【问题标题】:How to search in array of object in mongodb如何在mongodb中的对象数组中搜索
【发布时间】:2012-12-12 00:14:34
【问题描述】:

假设 mongodb 文档(表)'users' 是

{
    _id: 1,
    name: {
        first: 'John',
        last: 'Backus'
    },
    birth: new Date('Dec 03, 1924'),
    death: new Date('Mar 17, 2007'),
    contribs: ['Fortran', 'ALGOL', 'Backus-Naur Form', 'FP'],
    awards: [
        {
            award: 'National Medal',
            year: 1975,
            by: 'NSF'
        },
        {
            award: 'Turing Award',
            year: 1977,
            by: 'ACM'
        }
    ]
}
// ...and other object(person)s

我想找到获得“国家奖章”并且必须在 1975 年获得的人 可能有其他人在不同年份获得此奖项。

如何使用奖励类型和年份找到此人。所以我可以找到确切的人。

【问题讨论】:

    标签: javascript arrays node.js mongodb express


    【解决方案1】:

    正确的做法是:

    db.users.find({awards: {$elemMatch: {award:'National Medal', year:1975}}})
    

    $elemMatch 允许您在同一数组元素中匹配多个组件。

    如果没有$elemMatch,mongo 将寻找某年获得国家奖章的用户和 1975 年获得某项奖项的用户,但不会寻找 1975 年获得国家奖章的用户。

    请参阅MongoDB $elemMatch Documentation 了解更多信息。有关使用数组查询文档的更多信息,请参阅Read Operations Documentation

    【讨论】:

    • 即elemMatch 匹配奖项“和”年份(而不是奖项“或”年份)
    • 如何以简单的方式只查询名字为 John 并获得国家奖章的文件?我们通过聚合和迭代奖励数组来做到这一点,但想知道简单的查询
    • 如果 year 是一个字符串数组,查询会是什么样子?
    • @Gobliins 相同,除了 year 将是一个字符串
    【解决方案2】:

    使用$elemMatch 查找特定对象的数组

    db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})
    

    【讨论】:

    • 将两个对象传递给 findOne,这本质上是一个“子查询”吗? IE,我们找到 _ID = ID 然后使用 $elemMatch 在里面搜索?
    【解决方案3】:

    您可以通过两种方式做到这一点:

    1. ElementMatch - $elemMatch(如上述答案所述)

      db.users.find({ awards: { $elemMatch: {award:'Turing Award', year:1977} } })

    2. $andfind 一起使用

      db.getCollection('users').find({"$and":[{"awards.award":"Turing Award"},{"awards.year":1977}]})

    【讨论】:

      【解决方案4】:

      如上述答案中所述,另外,要从整个数组中仅返回一个字段,您可以使用 projection 进行查找。并使用$

      db.getCollection("sizer").find(
        { awards: { $elemMatch: { award: "National Medal", year: 1975 } } },
        { "awards.$": 1, name: 1 }
      );
      

      将返回

      {
          _id: 1,
          name: {
              first: 'John',
              last: 'Backus'
          },
          awards: [
              {
                  award: 'National Medal',
                  year: 1975,
                  by: 'NSF'
              }
          ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2012-04-07
        相关资源
        最近更新 更多