2014-12-19 39 views
10

我試圖將一個十六進制字符串轉換爲聚合查詢中的等價ObjectID。我嘗試了兩種不同的方法:在使用方法MongoDB彙總項目字符串到ObjectId

db.omvas.aggregate([ 
    {$project:{ 
     EID:{$let: { 
       vars: { 
        id: "$EID" 
       }, 
       in: ObjectId("$$id") 
      }}, 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

db.omvas.aggregate([ 
    {$project:{ 
     EID: ObjectId("$EID") 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

我不斷收到錯誤 「長度錯誤:無效的對象ID」。我測試了添加一個文字字符串來代替聚合變量,並且我得到了一個合適的ObjectID的結果。似乎字符串值沒有被傳遞給Mongo的ObjectId函數,而是變量名作爲文字字符串被傳遞。

任何人有任何想法,如果我想完成是可能的?有沒有我失蹤的魔法?

回答

3

ObjectId是shell中ObjectId的構造函數。當你喜歡寫東西

"EID" : { "$let" : { 
      "vars" : { "id" : "$EID" }, 
      "in" : ObjectId("$$id") 
     } } 

蒙戈外殼發送聚合請求之前評估ObjectId("$$id")。這就好像你在Javascript中調用函數一樣,如

var x = 2 
var y = 4 
f(x + y) // f(6) 

你需要的是一個聚合運算符來將字符串轉換爲ObjectId。不幸的是,不存在這樣的函數,例如MongoDB 2.6。爲什麼你需要轉換字符串?你打算怎麼處理它?也許有一種方法可以解決聚合中缺少轉換操作符的問題。

+0

謝謝,這很有道理。這個特定的查詢只是報告工作流程中的一個階段。 ObjectId是必需的,因爲它正在被管道下方的查詢使用。我正在重新思考他們現在的工作方式,並認爲我有更好的方式來執行它們。 – StevenWarren

+1

在我的情況下,我想做'$ lookup',其中本地字段是ObjectId的字符串表示,而外部字段是實際的ObjectId。任何想法,如果這是可能的MongoDB 3.2? – Madbreaks

+1

解決方法是編寫一個腳本,將包含該id的新字段作爲ObjectId添加到集合中的文檔。然後使用新字段進行$查找。 –

相關問題