对于这个特定的情况,一切正常,除非
对于field1
,field2
请求的字段,field1
是field2
的一部分。
示例:
> 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的查询方面这是可行的。
答案 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