Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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$elemMatch返回所有子文档_Mongodb_Mongodb Query - Fatal编程技术网

查询中的mongodb$elemMatch返回所有子文档

查询中的mongodb$elemMatch返回所有子文档,mongodb,mongodb-query,Mongodb,Mongodb Query,使用$elemMatch作为查询运算符,它将返回“m”中的所有子文档!!奇怪 将其用作项目操作员: db.aaa.insert({"_id":1, "m":[{"_id":1,"a":1},{"_id":2,"a":2}]}) db.aaa.find({"_id":1,"m":{$elemMatch:{"_id":1}}}) { "_id" : 1, "m" : [ { "_id" : 1, "a" : 1 }, { "_id" : 2, "a" : 2 } ] } 这没关系。按照此逻辑,将其

使用$elemMatch作为查询运算符,它将返回“m”中的所有子文档!!奇怪

将其用作项目操作员:

db.aaa.insert({"_id":1, "m":[{"_id":1,"a":1},{"_id":2,"a":2}]})
db.aaa.find({"_id":1,"m":{$elemMatch:{"_id":1}}})
{ "_id" : 1, "m" : [ { "_id" : 1, "a" : 1 }, { "_id" : 2, "a" : 2 } ] }
这没关系。按照此逻辑,将其用作“更新”中的查询运算符将更改“m”中的所有子文档。因此,我:

db.aaa.find({"_id":1},{"m":{$elemMatch:{"_id":1}}})
{ "_id" : 1, "m" : [ { "_id" : 1, "a" : 1 } ] }
它以第二个示例(项目操作员)的方式工作。这真把我弄糊涂了。
给我解释一下这并不奇怪,是它的工作原理

您正在使用$elemMatch来匹配文档中包含的数组中的元素。这意味着它mactches是“文档”而不是“数组元素”,因此它不只是选择性地只显示匹配的数组元素

您可以做的,以及如何在$set操作符中使用它,是使用位置$operator从查询端指示匹配的“位置”:

db.aaa.update({"_id":1,"m":{$elemMatch:{"_id":1}}},{$set:{"m.$.a":3}})
db.aaa.find()
{ "_id" : 1, "m" : [ { "_id" : 1, "a" : 3 }, { "_id" : 2, "a" : 2 } ] }
这将只显示数组中的一个元素。但它当然*在显示的结果中仍然是一个数组,并且不能将其强制转换为其他类型

用法的另一部分是,这将只匹配一次。并且只有第一个匹配项将分配给位置运算符

因此,最简洁的解释可能是匹配“包含”查询中指定的子文档属性的“文档”,而不仅仅是“子文档”本身

有关更多信息,请参阅文档:


在第一个示例中,它确实匹配“m”中的子文档,但如果没有投影仪,它将输出整个文档。在第二个示例中,查询{“_id”:1}仍然可以匹配文档,并且它使用elemMatch来投影匹配的子文档。在update$set中:{“m.$”:1}实际上是一种项目,它投影匹配的子文档并设置它。我说得对吗?
db.aaa.find({"_id":1},{"m":{$elemMatch:{"_id":1}}},{ "m.$": 1 })