我有跟随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的数据。
请帮忙。
答案 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
);
}