0

mongoexport当明确指定感兴趣的字段时,似乎正在导出不需要的兄弟姐妹。我试过用mongo-2.6, mongo-3.0.2,mongo-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  

这会将整个 JSON 导出为myfield.

./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  

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

有趣的是,当--type=csv. 但是我对 JSON 输出感兴趣。

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

4

1 回答 1

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”字段,但不再显示兄弟姐妹或父文档。

于 2016-07-21T17:55:44.083 回答