集計で使用できる演算子はありますか?は、ObjectIdの代わりに文字列を取得する関数ですか?
db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}])
集計で使用できる演算子はありますか?は、ObjectIdの代わりに文字列を取得する関数ですか?
db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}])
の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
あなたはインライン$concat
演算子を使用してそれを行うことはできません。
db.something.aggregate(
[
{ $match :
{ 'property' :
{ $exists:true }
}
},
{ $project:
{ stringId:
{ $concat: [ ObjectId().str ] }
}
}
]
)
私にとって、これはレコードのObjectIdを "stringId"にしません。これは、新しいObjectIdの文字列化されたバージョンになります。特に、返されるすべてのドキュメントで同じ値です。だから私はこれが正しいとは思わない。 – mcdave
は何がありません。集計フレームワークはデータ型を再キャストしません(数値から '$ substr'までの文字列と、数値から日付または日付への文字列を除く)は、基本的にトリッキーで可能です。とにかくこれが必要と思われるのはなぜですか?とにかく 'ObjectId'値を文字列として書くのは、ほとんどの言語ではかなり簡単です。 –
@BlakesSevenいつもの理由があります:)簡単さのためです。もちろん、それを処理することができます。しかし、結果を単純な文字列を必要とする他のサービス/パーティに渡すことができればいいです。 ... – matus
私が言ったように、ほとんどの言語でBSONはちょうどローカルタイプにキャストされます。また、「ほとんどの」言語では、単純に文字列として出力する必要はありません。個人的には、拡張されたJSON出力形式、すなわち '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}'を優先します。これは、リモートクライアントがデータが実際に 'ObjectId'であることを知ることができるからです。これは良いことです。特に、ストレージが文字列の長さの半分**であることを考慮してください。 –