我正在查询检索芒果收集的数据,我以两种不同的方式进行相同的查询。
工作查询
db.getCollection('routes').find({"routes.routeId": "r1qJo2zWG"}, {routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}})
无效查询
db.getCollection('routes').find({routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}, {"routes.routeId": "r1qJo2zWG"})
查询工作取决于属性声明,例如在第一个/最后一个位置的“routes.routeId”。
明白为什么会在mongodb查询中发生这种情况。
答案 0 :(得分:2)
您正在混合查询和投影。这两个查询都按预期工作。
find
方法同时进行查询和投影。
第一个例子(有效)
db.getCollection('routes').find({"routes.routeId": "r1qJo2zWG"}, {routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}})
查询部分
{"routes.routeId": "r1qJo2zWG"}
投影部分
{routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}
您正在查询路由数组的routeId值为" r1qJo2zWG"然后是$elemMatch(projection)
来限制routes元素以输出匹配的路由,其routeId值为" r1qJo2zWG"
第二个例子(无效)
db.getCollection('routes').find({routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}, {"routes.routeId": "r1qJo2zWG"})
查询部分
{routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}
投影部分
{"routes.routeId": "r1qJo2zWG"}
您正在使用$elemMatch(query)
查询所有文档,其中routes数组的routeId值为" r1qJo2zWG" (与{" routes.routeId":" r1qJo2zWG"}和$elemMatch
运算符完全相同,单个条件匹配)后跟无效投影{&#34 ; routes.routeId":" r1qJo2zWG"}。
正确的投影(如果使用)应为{" routes.routeId":1}以显示路径数组的所有路径ID值。