Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在子文档中使用db.collection.find查询_Mongodb_Find - Fatal编程技术网

Mongodb 在子文档中使用db.collection.find查询

Mongodb 在子文档中使用db.collection.find查询,mongodb,find,Mongodb,Find,是否有一种方法可以使用db.collection.find()查询子文档中的特定值并查找匹配的文档。例如: { {'Joe':{eyecolor:'brown'}, {'Mary':{eyecolor:'blue'}, .... } 我想返回所有眼睛颜色为蓝色的人的姓名。您需要指定搜索值的完整路径: db.people.find({ "Joe.eyecolor" : "brown" }) 您无法切换到人员数组而不是当前使用的关联数组样式,因为无法仅返回符合条件的数组元素。您可以使用$elemM

是否有一种方法可以使用db.collection.find()查询子文档中的特定值并查找匹配的文档。例如:

{ {'Joe':{eyecolor:'brown'}, {'Mary':{eyecolor:'blue'}, .... }


我想返回所有眼睛颜色为蓝色的人的姓名。

您需要指定搜索值的完整路径:

db.people.find({ "Joe.eyecolor" : "brown" })
您无法切换到人员数组而不是当前使用的关联数组样式,因为无法仅返回符合条件的数组元素。您可以使用
$elemMatch
返回第一个匹配项,但这可能不是您想要的。或者,您仍然可以使用数组,但需要过滤在客户端代码(而不是数据库)中进一步设置数组

您可能可以使用聚合框架,但它不能有效地使用索引,因为您需要
$解开整个数组,然后进行过滤、暴力。如果包含的数据更复杂,使用AF时的投影需要您手动指定所有字段,这就有点麻烦了

要最有效地执行显示的查询,您需要不使用子文档,而是将人员作为单个文档放置:

{ 
    name: "Joe",
    eyecolor: "brown" 
}
然后,您可以进行简单的搜索,如:

db.people.find({eyecolor: "brown"})

您需要指定一个值的完整路径,以便搜索工作:

db.people.find({ "Joe.eyecolor" : "brown" })
您无法切换到人员数组而不是当前使用的关联数组样式,因为无法仅返回符合条件的数组元素。您可以使用
$elemMatch
返回第一个匹配项,但这可能不是您想要的。或者,您仍然可以使用数组,但需要过滤在客户端代码(而不是数据库)中进一步设置数组

您可能可以使用聚合框架,但它不能有效地使用索引,因为您需要
$解开整个数组,然后进行过滤、暴力。如果包含的数据更复杂,使用AF时的投影需要您手动指定所有字段,这就有点麻烦了

要最有效地执行显示的查询,您需要不使用子文档,而是将人员作为单个文档放置:

{ 
    name: "Joe",
    eyecolor: "brown" 
}
然后,您可以进行简单的搜索,如:

db.people.find({eyecolor: "brown"})

是和否。您可以查询具有匹配人员的所有文档,但不能直接查询所有人员。换句话说,子文档不是虚拟集合,您将始终返回“父”文档

您发布的示例附带了额外的复杂性,即您将名称用作字段键,这会阻止您使用点表示法

一般来说,如果你有很多相似的东西,最好把它们列在一个列表中,例如

{ 
   "_id" : 132,
   "ppl" : [ { "Name" : "John", "eyecolor" : "blue" },
             { "Name" : "Mary", "eyecolor" : "brown" },
             ...
           ]
}
然后,您可以使用聚合框架进行查询:

db.collection.aggregate([ 
// only match documents that have a person w/ blue eyes (can use indexing)
{$match : { "ppl.eyecolor" : "blue" } }, 
// unwind the array of people
{$unwind : "$ppl" }, 
// match only those with blue eyes
{$match : { "ppl.eyecolor" : "blue" }}, 
// optional projection to make the result a list of people
{$project : { Name : "$ppl.Name", EyeColor: "$ppl.eyecolor" }} ]);
结果是

"result" : [
     {
             "_id" : 132,
             "Name" : "John",
             "EyeColor" : "blue"
     },
     {
             "_id" : 12,
             "Name" : "Jimmy",
             "EyeColor" : "blue"
     },
     {
             "_id" : 4312,
             "Name" : "Jimmy",
             "EyeColor" : "blue"
     },
     {
             "_id" : 4312,
             "Name" : "Marc",
             "EyeColor" : "blue"
     }
],
"ok" : 1

是和否。您可以查询具有匹配人员的所有文档,但不能直接查询所有人员。换句话说,子文档不是虚拟集合,您将始终返回“父”文档

您发布的示例附带了额外的复杂性,即您将名称用作字段键,这会阻止您使用点表示法

一般来说,如果你有很多相似的东西,最好把它们列在一个列表中,例如

{ 
   "_id" : 132,
   "ppl" : [ { "Name" : "John", "eyecolor" : "blue" },
             { "Name" : "Mary", "eyecolor" : "brown" },
             ...
           ]
}
然后,您可以使用聚合框架进行查询:

db.collection.aggregate([ 
// only match documents that have a person w/ blue eyes (can use indexing)
{$match : { "ppl.eyecolor" : "blue" } }, 
// unwind the array of people
{$unwind : "$ppl" }, 
// match only those with blue eyes
{$match : { "ppl.eyecolor" : "blue" }}, 
// optional projection to make the result a list of people
{$project : { Name : "$ppl.Name", EyeColor: "$ppl.eyecolor" }} ]);
结果是

"result" : [
     {
             "_id" : 132,
             "Name" : "John",
             "EyeColor" : "blue"
     },
     {
             "_id" : 12,
             "Name" : "Jimmy",
             "EyeColor" : "blue"
     },
     {
             "_id" : 4312,
             "Name" : "Jimmy",
             "EyeColor" : "blue"
     },
     {
             "_id" : 4312,
             "Name" : "Marc",
             "EyeColor" : "blue"
     }
],
"ok" : 1

这是一个非常糟糕的设计这是一个非常糟糕的设计