繁体   English   中英

如何在mongodb中搜索对象数组

[英]How to search in array of object in mongodb

假设 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年颁发的人。可能有其他人在不同的年份获得过这个奖项。

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

正确的方法是:

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

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

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

有关更多信息,请参阅MongoDB $elemMatch 文档 有关使用数组查询文档的更多信息,请参阅阅读操作文档

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

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

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

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

如上述答案中所述另外,要从整个数组中仅返回一个字段,您可以使用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'
        }
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM