假设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

我想找到那个必须在1975年被授予“国家勋章”的人 可能还有其他人在不同的年份获得过这个奖项。

我如何使用奖项类型和年份找到这个人。这样我就能得到准确的人。


正确的做法是:

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

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

没有$elemMatch, mongo将寻找在某些年份和1975年获得国家勋章的用户,而不是在1975年获得国家勋章的用户。

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

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

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

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

ElementMatch - $elemMatch(如上面的答案所解释) db.users。find({awards: {$elemMatch: {award:'图灵奖',年份:1977}}}) 使用$和with find db.getCollection(“用户”);({”和“美元:[{”奖项。奖”:“图灵奖”},{“awards.year”:1977}]})

同样,要从整个数组中只返回一个字段,您可以使用投影到find。然后使用$

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