2012-08-10 69 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

相关问题