如何在mongodb中搜索对象数组

vcx*_*cxz 186 javascript arrays mongodb node.js express

假设mongodb文档(表)'用户'是

{
  _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
Run Code Online (Sandbox Code Playgroud)

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

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

Leo*_*tny 331

正确的方法是:

db.users.find({awards: {$elemMatch: {award:'National Medal', year:1975}}})
Run Code Online (Sandbox Code Playgroud)

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

如果没有$elemMatchmongo将会在某些年份获得国家奖章,并在1975年获得一些奖项,但1975年获得国家奖章的用户则不会.

有关详细信息,请参阅MongoDB $ elemMatch文档.有关使用数组查询文档的详细信息,请参阅读取操作文档.

  • 即elemMatch匹配奖项'和'年份(而不是奖励'或'年) (4认同)

KAR*_*N.A 21

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

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


Moh*_*adi 17

正如上面答案中所解释的另外,要从整个数组中仅返回一个字段,您可以使用projectionfind 。并使用$

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

将会返回

{
    _id: 1,
    name: {
        first: 'John',
        last: 'Backus'
    },
    awards: [
        {
            award: 'National Medal',
            year: 1975,
            by: 'NSF'
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)


Job*_*ews 6

您可以通过两种方式执行此操作:

  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}]})