2015-09-02 25 views
1

我收集了很多,我想導出爲CSV,但我喜歡做一些微調的一些領域。 (例如我只需要知道一些元素的數量,只是爲了知道其他人是否存在於doc中)Mongoexport - 修改大陣場他們的罪名

我想在字段上做一個相當於map的函數,包含一個列表將被導出到列表大小,以及一些有時存在並且有時不存在的字段,我希望將它們導出爲布爾標誌。

例如如果我的行看起來像這樣

{_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) 如果沒有,是否有另一種方法可以做到這一點?

回答

2

mongoexport實用程序本身是非常簡陋的,只是套件中的一個基本工具。您可以添加「查詢」過濾器,但幾乎就像.find()查詢一般,其目的是恢復文件「原樣」,而不是「操縱」的內容。

正如其他查詢操作,.aggregate()方法是後話,文檔操作非常有用。因此,爲了「操縱」,輸出的東西從原來的文件源不同,你會怎麼做:

db.collection.aggregate([ 
    { "$project": { 
     "listField": { "$size": "$listField" }, 
     "optionalField": { 
      "$cond": [ 
       { "$ifNull": [ "$optionalField", false ] }, 
       true, 
       false 
      ] 
     } 
    }} 
]) 

$size運算符返回數組的「大小」,而$ifNull測試的存在,無論是返回字段值或備用字段。將該結果傳遞到$cond以獲得true/false返回而不是字段值。 「_id」總是隱含的,除非你特別要求忽略它。

這會給你「減少」的輸出,但爲了去CSV,那麼你將不得不自己編碼導出,因爲mongoexport不會運行聚合流水線查詢。

但是代碼這樣做應該是很微不足道的(選擇適合您的語言庫),並聚集聲明也是微不足道的,你可以在這裏看到。

對於「非常基本的」的方法,那麼只需發送一個腳本來mongo外殼,作爲節目的一個非常基本的形式:

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