如何通过搜索数组中的值来查询文档?

How to query for documents by searching for a value in an array?

所以以下面三个文档为例

[
  {
    _id: '/players/c/cruzne02.shtml',
    url: '/players/c/cruzne02.shtml',
    name: 'Nelson Cruz',
    image: 'https://www.baseball-reference.com/req/202108020/images/headshots/f/fea2f131_mlbam.jpg',
    teams: {
      MIL: [ 2005 ],
      TEX: [
        2006, 2007, 2007, 2008,
        2008, 2009, 2009, 2010,
        2010, 2011, 2011, 2012,
        2012, 2013, 2013
      ],
      BAL: [ 2014 ],
      SEA: [
        2015, 2016,
        2016, 2017,
        2017, 2018,
        2018
      ],
      MIN: [ 2019, 2020, 2020, 2021, 2021 ],
      TBR: [ 2021 ]
    }
  },
  {
    _id: '/players/b/berrijo01.shtml',
    url: '/players/b/berrijo01.shtml',
    name: 'Jose Berrios',
    image: 'https://www.baseball-reference.com/req/202108020/images/headshots/d/d94db113_mlbam.jpg',
    teams: {
      MIN: [
        2016, 2017, 2017,
        2018, 2018, 2019,
        2019, 2020, 2020,
        2021, 2021
      ],
      TOR: [ 2021 ]
    }
  },
  {
    _id: '/players/m/mauerjo01.shtml',
    url: '/players/m/mauerjo01.shtml',
    name: 'Joe Mauer',
    image: 'https://www.baseball-reference.com/req/202108020/images/headshots/4/43c69595_mlbam.jpg',
    teams: {
      MIN: [
        2004, 2005, 2005, 2006, 2006,
        2007, 2007, 2008, 2008, 2009,
        2009, 2010, 2010, 2011, 2011,
        2012, 2012, 2013, 2013, 2014,
        2014, 2015, 2015, 2016, 2016,
        2017, 2017, 2018, 2018
      ]
    }
  }
]

例如,如果我想查询在 2016 年为 MIN 队效力的人,我想获得第二个和第三个文档。但是,如果我在 MIN 数组中查询 2020,我将得到第一个和第二个文档 returned。我正试图从某支球队招募球员,但我不确定如何构建我的发现以获得我正在寻找的结果。

我试过使用

db.Players.find({teams:{MIN: {$elemMatch: 2021}}});

但它 return 什么都没有。我是不是用错了 $elemMatch?

teams 字段是一个对象而不是数组,我相信这就是 $elemMatch 不起作用的原因,因为它是一个数组运算符。

如果你想使用 $elemMatch,你可以尝试这样的查询,它指定 teams.MIN,它是一个数组:

db.Players.find({ "teams.MIN" : { $elemMatch: { $eq: 2021 }}});

但是因为这是一个 $elemMatch with a single query condition 的例子,所以这样做会更简单:

db.Players.find({ "teams.MIN" : 2021 });