【问题标题】:Query a mongodb document containing array [duplicate]查询包含数组的mongodb文档[重复]
【发布时间】:2018-05-25 01:30:46
【问题描述】:

我有以下 json 文件

{
  "movies": [{
    "title" : "Star Wars: Episode I - The Phantom Menace",
    "episode_number" : "1",
    "main_characters" : ["Qui-Gon Jinn", "Obi-Wan Kenobi"],
    "description" : "The evil Trade Federation, led by Nute Gunray is planning to take over the peaceful world of Naboo. ",
    "poster" : "star_wars_episode_1_poster.png",
    "hero_image" : "star_wars_episode_1_hero.jpg"
  },

  {
    "title" : "Star Wars: Episode II - Attack of the Clones",
    "episode_number" : "2",
    "main_characters" : ["Obi-Wan Kenobi", "Anakin Skywalker"],
    "description" : "Ten years after the 'Phantom Menace' threatened the planet Naboo, Padmé Amidala is now a Senator representing her homeworld.",
    "poster" : "star_wars_episode_2_poster.png",
    "hero_image" : "star_wars_episode_2_hero.jpg"
  }
]
}

集合名称是水果

我正在尝试仅提取 episode_number = 2 的数据。我尝试了以下查询

db.fruits.find({"movies": {$elemMatch:{"episode_number": "2"}}}).pretty();

返回整个文档,而不仅仅是 episode_number 2 的数据。

db.fruits.find({"movies.episode_number": "2"}}}).pretty();

它还返回整个文档,包括第 1 集的文档

我正在尝试弄清楚如何查询此文档,以便仅返回 episode_number = 2 的数据。

请帮忙。

【问题讨论】:

  • 看起来您的 movies 对象应该是 db 中的另一个集合。现在每个fruit 文档都有movies 数组字段,这是设计使然吗?如果你真的需要这样的数据库设计,那么使用find 查询是不可能返回数组元素的,你应该使用聚合管道,但这将是非常昂贵的查询
  • 对不起,我应该指定,集合名称是水果

标签: json node.js mongodb


【解决方案1】:

find方法有两个参数:第一个代表过滤条件,第二个代表投影。要从数组中获取一个元素,您可以在投影部分使用$elemMatch

db.fruits.find(
   {"movies.episode_number": "2"}, 
   {"movies": {$elemMatch:{"episode_number": "2"}}})
.pretty();

所以第一个参数过滤掉你的集合,第二个过滤内部数组

【讨论】:

  • 过滤部分也可以是{"movies.episode_number": "2"}。这个查询返回带有单个元素的movies 数组的文档,但我认为它比构建大型聚合管道更好。
  • 好吧,我会简化这个,谢谢@MaxSinev
【解决方案2】:

如果您希望集合中的所有文档都包含电影数组,但它应该只包含第 2 集的详细信息,您需要过滤数组。

https://docs.mongodb.com/manual/reference/operator/aggregation/filter/ 或者使用 $unwind, $match。

db.fruits.aggregate
([
  {
      $unwind: '$movies'
  },

  {
      $match:{"movies.episode_number":'2'}

  }

])

【讨论】:

  • 谢谢。这与使用过滤器查找的其他答案一样有效
猜你喜欢
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2014-07-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多