如何在mongodb中搜索对象数组

IT技术 javascript arrays node.js mongodb express
2021-01-27 12:03:04

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

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

4个回答

正确的方法是:

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

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

没有$elemMatchmongo会寻找某年有国家勋章和1975年有奖的用户,但不会寻找1975年有国家勋章的用户。

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

@Gobliins 一样,除了 year 是一个字符串
2021-03-20 12:03:04
我们如何以简单的方式只查询那些名字为约翰和奖项为国家奖章的文件?我们通过聚合和迭代来完成它,但想知道简单的查询
2021-03-25 12:03:04
即 elemMatch 匹配奖励“和”年份(与奖励“或”年份相反)
2021-04-03 12:03:04
如果 year 是一个字符串数组,查询会是什么样子?
2021-04-10 12:03:04

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

db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})
将两个对象传递给 findOne,这本质上是一个“子查询”吗?IE,我们找到 _ID = ID 然后使用 $elemMatch 在里面搜索?
2021-04-08 12:03:04

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

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

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