13

SQLでは、次のようなことができます

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

任意の数学やその他の関数を効果的に実行し、それらを結果のフィールドとして返します。MongoDB でも同じことができますか?

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

私が期待するように、それは「インクリメント」フィールドを返しません。

このトピックで見つけることができる他のすべての関連する質問は、グループ化されたクエリを扱っていますが、これはそうではありません。ドキュメントがフェッチされるときに「仮想」フィールドをドキュメントに追加するだけです(クライアント側で計算されますか?)。

あるいは、この問題は「縮小」のない「マップ」のようです。各行には独自の計算フィールドがあります。マップ関数の結果を結果/カーソルとして返す方法はありますか?

4

1 に答える 1

13

MongoDB 2.2の新しい集計フレームワークでは、 $project演算子を介して計算フィールドを追加できます。サポートされている演算子を使用する必要があるため、これは任意の関数とまったく同じではありませんが、かなりの柔軟性を提供します。

_ids を新しい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
}
于 2012-08-11T00:35:10.057 に答える