2016-05-26 61 views
13

我在這種情況下,現在: 我有一個集合X:轉換中蒙戈的ObjectId爲String聚合

{ 
    _id:ObjectId('56edbb4d5f084a51131dd4c6'), 
    userRef:ObjectId('56edbb4d5f084a51131dd4c6'), 
    serialNumber:'A123123', 
    ... 
} 

我需要聚合的所有文件,由userRef + SERIALNUMBER將它們分組,所以我「M試圖用CONCAT這樣的:

$group: { 
     _id: { 
      '$concat': ['$userRef','-','$serialNumber'] 
     }, 
     ... 

所以我在MongoDB中聚集基本上,我用的ObjectId和一個字符串的級聯需要組文件。但是,似乎$ concat只接受字符串作爲參數:

uncaught exception: aggregate failed: { 

    "errmsg" : "exception: $concat only supports strings, not OID", 
    "code" : 16702, 
    "ok" : 0 
} 

有沒有辦法將ObjectId轉換爲聚集表達式中的字符串?

編輯

question是相關的,但我的解決方案不適合我的問題。 (特別是因爲我不能在聚合過程中使用ObjectId.toString())

確實我在Mongo的文檔中找不到任何ObjectId()。toString()操作,但我不知道是否有任何棘手的事情可以在這種情況下完成。

+0

也許'_id:[$ userRef,$ serialNumber]'有效嗎?它不會給你一個字符串。 –

回答

6

我無法找到自己想做的事情,所以我創建了一個MapReduce函數,最終以我想要的方式生成了密鑰(連接其他密鑰)。

最後,它看起來是這樣的:

db.collection('myCollection').mapReduce(
    function() { 
     emit(
      this.userRef.str + '-' + this.serialNumber , { 
       count: 1, 
       whateverValue1:this.value1, 
       whateverValue2:this.value2, 
       ... 
      } 
     ) 
    }, 
    function(key, values) { 
     var reduce = {} 
     .... my reduce function.... 
     return reduce 
    }, { 
     query: { 
      ...filters_here.... 
     }, 
     out: 'name_of_output_collection' 
    } 
); 
+1

你能告訴我你寫的代碼是什麼? –

+2

@SudhanshuGaur看看這是否有幫助。我編輯了評論 –

+0

謝謝你的回答,實際上我正在閱讀有關聚合和地圖縮減的問題,在那裏我發現地圖縮小比聚集太多了,我認爲要告訴你,如果你的coulf做得更好agregation。 –

-1

您可以使用$substrhttps://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substr$concat前施放任何對象的字符串。

這是一個適用於我的代碼示例。

group_id_i['_id'] = { 
    '$concat' => [ 
     { '$substr' => [ {'$year' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$month' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$dayOfMonth' => '$t'}, 0, -1] } 
    ] 
} 

t其中t是DateTime字段,此聚合返回像這樣的數據。

{ 
    "_id" => "28-9-2016", 
    "i" => 2 
} 
+0

$ substr似乎在日期工作,但不是ObjectId – rrrr

0

我想你可能會嘗試通過使用包含兩個字段的數組來解決它:

{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}} 

這可能與兩個字段到過濾器匹配的數據。請注意,newkey數組中的數據應該與filterArray元素具有相同的數據類型。