MongoDB4.0は$convert
を追加します 集計演算子と$toString
まさにそれを可能にするエイリアス:
db.getCollection('example').aggregate([
{ "$match": { "example":1 } },
{ "$project": { "_id": { "$toString": "$_id" } } }
])
主な使用法は、おそらく_id
を使用することです。 ドキュメントの「キー」としての価値。
db.getCollection('example').insertOne({ "a": 1, "b": 2 })
db.getCollection('example').aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": [
[{
"k": { "$toString": "$_id" },
"v": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"cond": { "$ne": ["$$this.k", "_id"] }
}
}
}
}]
]
}
}}
])
どちらが返されますか:
{
"5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}
他の例と同様に、これは文字列を明確に示しています。
通常、ドキュメントがサーバーから返されるときにカーソルを「変換」する方法があります。 ObjectId
なので、これは通常は良いことです は、より多くのスペースを必要とする24文字の16進「文字列」とは対照的に、12バイトのバイナリ表現です。
シェルには.map()
があります メソッド
db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
また、NodeJSにはCursor.map()
があります これはほとんど同じことをすることができます:
let cursor = db.collection('example').find()
.map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
while ( await cursor.hasNext() ) {
let doc = cursor.next();
// do something
})
また、同じ方法が他のドライバーにも存在します(PHPだけではありません)。または、カーソルを繰り返してコンテンツを変換することもできます。これが最善の方法です。
実際、シェルで作業しているときに、カーソルを返すステートメントに追加するだけで、カーソル全体の結果を非常に簡単に1つのオブジェクトにまとめることができます
.toArray().reduce((o,e) => {
var _id = e._id;
delete e._id;
return Object.assign(o, { [_id]: e })
},{ })
または、nodejsなどの完全なES6 JavaScriptサポート環境の場合:
.toArray().reduce((o,({ _id, ...e })) => ({ ...o, [_id]: e }),{ })
集約フレームワークで処理する必要があるものの複雑さのない、本当に単純なもの。そして、ほとんど同じ方法で、どの言語でも非常に可能です。