mongoexport在文档树中导出不需要的兄弟节点

时间:2016-07-18 07:48:12

标签: json mongodb mongoexport

当明确指定感兴趣的字段时,

mongoexport似乎正在导出不需要的兄弟姐妹。我使用mongo-2.6mongo-3.0.2mongo-3.2.8尝试了这一点,所有人都表达了同样的行为。

例如:

./mongoexport --host my.mongo.host:10099  --db mydb --collection mycoll --fields myfield --query '{"some.attribute.filter":"some-attribute-value"}' --limit 1 --out /tmp/myexport.json  

这会导出myfield的整个JSON。

./mongoexport --host my.mongo.host:10099  --db mydb --collection mycoll --fields myfield.desiredSubField --query '{"some.attribute.filter":"some-attribute-value"}' --limit 1 --out /tmp/myexport.json  

这也会导出myfield的整个JSON,而不是仅导出嵌套字段myfield.desiredSubField

有趣的是,--type=csv时同样有用。但是我对JSON输出很感兴趣。

这种行为是设计还是我做错了? 如果这是设计的,还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

  

这种行为是设计还是我做错了?

是的,这是https://docs.mongodb.com/manual/reference/program/mongoexport/#cmdoption--fields中记录的设计。 - fields 仅支持顶级字段提取。

  

如果这是设计的,还有其他选择吗?

需要考虑的替代方案可能包括:

以下是汇总的示例:

db.coll.aggregate([
      {$match : {"some.attribute.filter":"some-attribute-value"}},
      {$project : {"new-field-name":"$myfield.desiredSubField", _id:0 }}, 
      {$out : "new-collection-name"}
])

在带有 testrc 集合的mongo shell中创建一个新的嵌套集合

> db.testrc.find()
{ "_id" : ObjectId("578d1ac48c3757a609a36286"), "a" : { "b" : 3 }, "b" : { "a" : 3 }, "c" : { "a" : 1 } }
{ "_id" : ObjectId("578fc7faed1d015678b0252a"), "a" : { "b" : 3, "c" : 10, "d" : 11 }, "b" : { "a" : 3, "c" : 10, "d" : 11 }, "c" : { "a" : 1 } }

> db.testrc.aggregate([{$match:{"b.a":{$gte:0}}},{$project : {"b_a":"$b.a", _id:0 }}, {$out :"nested"}])

> db.nested.find()
{ "_id" : ObjectId("578fc8ad1ecfad36cde071c9"), "b_a" : 3 }
{ "_id" : ObjectId("578fc8ad1ecfad36cde071ca"), "b_a" : 3 }

然后

$ mongoexport --db testr --collection nested --fields b_a --out ba.json

会导致

$ cat ba.json
{"_id":{"$oid":"578fc8ad1ecfad36cde071c9"},"b_a":3.0}
{"_id":{"$oid":"578fc8ad1ecfad36cde071ca"},"b_a":3.0}

仍然包含“_id”字段,但不再显示兄弟姐妹或父文件。