Mongoexport - 将大型数组字段修改为其计数

时间:2015-09-02 01:29:36

标签: mongodb mongodb-query aggregation-framework

我有一个大型的收藏品,我想导出到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) 如果没有,还有另一种方法吗?

1 个答案:

答案 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