2012-08-10 98 views
10

在SQL我可以做類似是否有可能從MongoDB查詢返回計算的字段?

SELECT myNum, (myNum+1) as `increment` FROM myTable 

切實做好任意數學等功能,並返回那些在結果中的字段。同樣可以用MongoDB來完成嗎?

db.test.find({}, {_id:1, myNum:1, increment:function() { return this.myNum + 1;}}); 

這不會像我期望的那樣返回「增量」字段。

我可以在這個主題上找到所有其他相關的問題處理GROUPED查詢,這是不是;我只是在獲取文檔時添加一個「虛擬」字段(客戶端計算?)。或者,這個問題似乎是一個沒有「減少」的「地圖」;每一行都有自己的計算字段。有什麼方法可以將結果作爲結果/遊標返回嗎?

回答

11

MongoDB 2.2中的新允許您通過$project運算符添加計算字段。這與任意函數不完全相同,因爲您需要使用supported operators,但它確實提供了很大的靈活性。

這是你的遞增_id s轉換爲新myNum領域的例子:

MongoDB shell version: 2.2.0-rc0 

> db.test.insert({_id:123}); 

> db.test.insert({_id:456}); 

> db.test.aggregate(
    { $project : { 
     _id : 1, 
    'myNum': { $add: [ "$_id", 1]} 
    }} 
) 
{ 
    "result" : [ 
     { 
      "_id" : 123, 
      "myNum" : 124 
     }, 
     { 
      "_id" : 456, 
      "myNum" : 457 
     } 
    ], 
    "ok" : 1 
} 
+0

嗯,這看起來很有希望。儘管該文檔列出了2.1版作爲具有該功能的第一個版本,但不是2.2。不幸的是,它沒有'$ count'功能;爲了我的真實世界的目的,我必須對一個子文檔數組進行計數。那和Fedora 16 repos目前只有2.0,所以我可能不得不這樣做客戶端 – MidnightLightning 2012-08-13 12:59:51

+1

@MidnightLightning:你是正確的,聚合框架首次出現在2.1.x開發版本中。 2.2.0將成爲該功能的穩定版/正式版。自7月中旬以來,2.2.0rc0已經[可從mongodb.org/downloads](http://www.mongodb.org/downloads)下載。您無法實現從包含map/reduce的單個文檔計算的字段示例,因爲不會調用reduce()函數,除非地圖爲給定鍵發出多個文檔。 – Stennie 2012-08-13 20:28:12

+0

@MidnightLightning:值得注意的是自2012年8月底以來,[MongoDB 2.2.0正式版發佈](http://docs.mongodb.org/manual/release-notes/2.2/)現已發佈。 – Stennie 2012-09-09 15:13:42

相關問題