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
这会导出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输出很感兴趣。
这种行为是设计还是我做错了? 如果这是设计的,还有其他选择吗?
答案 0 :(得分:1)
这种行为是设计还是我做错了?
是的,这是https://docs.mongodb.com/manual/reference/program/mongoexport/#cmdoption--fields中记录的设计。 - fields 仅支持顶级字段提取。
如果这是设计的,还有其他选择吗?
需要考虑的替代方案可能包括:
使用mongoDB支持的驱动程序以编程方式提取数据。 (有关详细信息,请参阅docs.mongodb.com/ecosystem/drivers /)
使用聚合创建要导出的新集合,其中可以通过对https://docs.mongodb.com/manual/reference/operator/aggregation/project/#include-computed-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”字段,但不再显示兄弟姐妹或父文件。