查询包含数组的mongodb文档

时间:2018-05-24 15:17:57

标签: json node.js mongodb

我有跟随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();

还返回整个文档,包括episode_number 1的文档

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

请帮忙。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

// PHP 7.+
function paths_join(string ...$parts): string {
    $parts = array_map('trim', $parts);
    $path = [];

    foreach ($parts as $part) {
        if ($part !== '') {
            $path[] = $part;
        }
    }

    $path = implode(DIRECTORY_SEPARATOR, $path);

    return preg_replace(
        '#' . preg_quote(DIRECTORY_SEPARATOR) . '{2,}#',
        DIRECTORY_SEPARATOR,
        $path
    );
}