2016-03-17 10 views
13

集計で使用できる演算子はありますか?は、ObjectIdの代わりに文字列を取得する関数ですか?

db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}]) 
+2

は何がありません。集計フレームワークはデータ型を再キャストしません(数値から '$ substr'までの文字列と、数値から日付または日付への文字列を除く)は、基本的にトリッキーで可能です。とにかくこれが必要と思われるのはなぜですか?とにかく 'ObjectId'値を文字列として書くのは、ほとんどの言語ではかなり簡単です。 –

+1

@BlakesSevenいつもの理由があります:)簡単さのためです。もちろん、それを処理することができます。しかし、結果を単純な文字列を必要とする他のサービス/パーティに渡すことができればいいです。 ... – matus

+1

私が言ったように、ほとんどの言語でBSONはちょうどローカルタイプにキャストされます。また、「ほとんどの」言語では、単純に文字列として出力する必要はありません。個人的には、拡張されたJSON出力形式、すなわち '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}'を優先します。これは、リモートクライアントがデータが実際に 'ObjectId'であることを知ることができるからです。これは良いことです。特に、ストレージが文字列の長さの半分**であることを考慮してください。 –

答えて

6

のObjectIdから文字列を取得するための集約関数には直接オペレータはありません。

バージョン2.6以降ObjectId.toString()メソッドを使用すると、ObjectIdを文字列に変換できます。まず、ObjectIDにマッチして投影します。次に、ObjectID.toString()を使用して、このオブジェクトIDを文字列に変換できます。

db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}]) 

そして、オブジェクトを結果として使用し、ObjectID.tostring()

Editを使用して応答として文字列を取得する:あなたが

ObjectId("507f191e810c19729de860ea").str

使用してオブジェクトIDのSTR属性にアクセスすることができますソース:mongodb docs

-11

あなたはインライン$concat演算子を使用してそれを行うことはできません。

db.something.aggregate(
    [ 
     { $match : 
      { 'property' : 
       { $exists:true } 
      } 
     }, 
     { $project: 
      { stringId: 
       { $concat: [ ObjectId().str ] } 
      } 
     } 
    ] 
) 
+0

私にとって、これはレコードのObjectIdを "stringId"にしません。これは、新しいObjectIdの文字列化されたバージョンになります。特に、返されるすべてのドキュメントで同じ値です。だから私はこれが正しいとは思わない。 – mcdave

関連する問題