当一个字段是请求的其他字段的根字段时,如何在查询中获取mongodb的所有子字段?

时间:2016-09-13 12:00:41

标签: mongodb

对于这个特定的情况,一切正常,除非 对于field1field2请求的字段,field1field2的一部分。

示例:

> db.mycoll.findOne()
{
    "_id" : 1,
    "data" : {
        "amounts" : {
            "dollar" : 20,
            "euro" : 18
        },
        "item" : "toy",
        "sale" : false
    }
}

   // works well
> db.mycoll.findOne({"_id":1},{ "data.amounts.dollar":1 })
{ "_id" : 1, "data" : { "amounts" : { "dollar" : 20 } } }



   // here "data" is root of "data.amounts.dollar" and "data.amounts.euro" 
   //   takes preference, how to query for "data", so 
   //   that all subfields of data are 
   //     returned
> db.mycoll.findOne({"_id":1},{ "data":1 , "data.amounts.dollar":1 })
{ "_id" : 1, "data" : { "amounts" : { "dollar" : 20 } } }

预期产出:

 {
        "_id" : 1,
        "data" : {
            "amounts" : {
                "dollar" : 20,
                "euro" : 18
            },
            "item" : "toy",
            "sale" : false
        }
    }

是的,可以在程序端格式化子字段,并将根字段发送到mongodb查询,但我的问题是如果在没有Javascript的查询方面这是可行的。

4 个答案:

答案 0 :(得分:6)

这是不寻常的行为,准确无误。

来自可靠/官方消息来源:

似乎该错误仍然存​​在。

如果您需要进一步分析,请与我们联系。

答案 1 :(得分:1)

db.mycoll.findOne({"_id":1},{"data.amounts.dollar":1,"data":1 })

答案 2 :(得分:0)

这给出了预期的结果

db.getCollection(coll_name).find({_id:1},{data:1});

这将提供输出

{     " _id" :1,     "数据" :{         "量" :{             "美元" :20,             "欧元" :18         },         "项目" :"玩具",         "销售" :假的     } }

答案 3 :(得分:0)

一旦你使用投影(' find()'中的第二个json文档,服务器将只返回投影中指定的那些字段(例外是' _id&# 39;除非被_id:0明确关闭,否则将返回。

{" data":1," data.amounts.dollar":1}

通过在子文档中选择data.amounts.dollar,您基本上已关闭data.amounts文档的其他成员。 您可以像使用美元一样打开它们,但我认为无论是否知道字段名称,您都希望它们全部投射。

我在文档中找不到有关投影字段中字段顺序的任何内容。

来自Mongo文档

https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/#projection-document