MongoDB 4.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
е 12-байтово двоично представяне, за разлика от шестнадесетичен "низ" от 24 знака, който заема много повече място.
Обвивката има .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), или можете просто да повторите курсора и да трансформирате съдържанието, както е по-вероятно най-доброто нещо, което трябва да направите.
Всъщност всички резултати от курсора могат да бъдат сведени в един обект с голяма лекота чрез просто добавяне към произволен оператор за връщане на курсора, когато работите в обвивката
.toArray().reduce((o,e) => {
var _id = e._id;
delete e._id;
return Object.assign(o, { [_id]: e })
},{ })
Или за пълна среда, поддържаща ES6 JavaScript, като nodejs:
.toArray().reduce((o,({ _id, ...e })) => ({ ...o, [_id]: e }),{ })
Наистина прости неща без сложността на това, което трябва да се обработва в рамката за агрегиране. И много възможно на всеки език чрез почти същите средства.