我有一个大型的收藏品,我想导出到CSV,但我想对某些字段进行一些修剪。 (例如,我只需要知道某些元素的数量,并且只知道文档中是否存在其他元素)
我想在字段上执行与map
函数等效的操作,以便包含列表的字段将导出到列表大小,并且某些字段有时存在,有时不存在,我会喜欢将它们导出为布尔标志。
e.g。如果我的行看起来像这样
{_id:"id1", listField:[1,2,3], optionalField: "...", ... }
{_id:"id2", listField:[1,2,3,4], ... }
我想将mongoexport运行到CSV,这将导致此
_id, listField.length, optinalField.exists
"id1", 3, , true
"id2", 4, , false
使用mongoexport可以吗? (假设MongoDB版本3.0) 如果没有,还有另一种方法吗?
答案 0 :(得分:2)
mongoexport
实用程序本身非常简洁,只是套件中捆绑的基本工具。您可以添加"查询"过滤器,但一般就像.find()
查询一样,目的是返回文件"按原样#34;而不是"操纵"内容。
与其他查询操作一样,.aggregate()
方法对文档操作非常有用。所以为了操纵"如果输出与原始文档源不同,您可以这样做:
db.collection.aggregate([
{ "$project": {
"listField": { "$size": "$listField" },
"optionalField": {
"$cond": [
{ "$ifNull": [ "$optionalField", false ] },
true,
false
]
}
}}
])
$size
运算符返回" size"对于存在的数组和$ifNull
测试,返回字段值或替换。将该结果传递到$cond
以获得true/false
返回而不是字段值。 " _id"总是隐含的,除非你特别要求省略它。
那会让你减少"减少"输出,但为了转到CSV,您必须自己编码导出,因为mongoexport
不运行聚合管道查询。
但是这样做的代码应该是非常简单的(为你的语言选择一个库),聚合语句也很简单,你可以在这里看到。
对于"非常基本的" 方法,然后只需将脚本发送到mongo
shell,作为一种非常基本的编程形式:
db.collection.aggregate([
{ "$project": {
"listField": { "$size": "$listField" },
"optionalField": {
"$cond": [
{ "$ifNull": [ "$optionalField", false ] },
true,
false
]
}
}}
]).forEach(function(doc) {
print(Object.keys(doc).map(function(key) {
return doc[key]
}).join(","));
});
哪个会输出:
id1,3,true
id2,4,false