能否从MongoDB查询中返回一个计算字段?

13

在SQL中我可以这样做:

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

能否在MongoDB中有效地执行任意数学和其他函数,并将其作为结果中的字段返回?

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

这并没有返回我预期的“增量”字段。

我在这个主题上找到的所有相关问题都处理了GROUP查询,而这个问题不是;当获取文档时(客户端计算?),我只是添加了一个“虚拟”字段到文档中。

或者,这个问题似乎是一个没有“reduce”的“map”;每行都有自己的计算字段。有没有办法将映射函数的结果作为结果/游标返回呢?

1个回答

13

MongoDB 2.2的新聚合框架允许您通过$project操作符添加计算字段。这与任意函数略有不同,因为您需要使用支持的操作符,但它确实提供了很大的灵活性。

以下是将_id递增到一个新的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
}

看起来很有前途。尽管文档将2.1版本列为具有该功能的第一个版本,而不是2.2。不幸的是,它没有$count函数;对于我的实际用途,我必须对子文档数组进行计数。此外,Fedora 16仓库目前只有2.0版本,因此我可能不得不在客户端执行此操作。 - MidnightLightning
1
@MidnightLightning:你说得对,聚合框架最初出现在2.1.x的开发版本中。2.2.0将是具备此功能的稳定/生产版本。自7月中旬以来,2.2.0rc0已经可以从mongodb.org/downloads下载。使用map/reduce无法实现从单个文档计算字段的示例,因为除非map针对给定键发出多个文档,否则reduce()函数不会被调用。 - Stennie
值得注意的是,自2012年8月底以来,MongoDB 2.2.0生产版本(http://docs.mongodb.org/manual/release-notes/2.2/)已经发布。 - Stennie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接