MongoDB 4.0 thêm $convert
toán tử tổng hợp và $toString
bí danh cho phép bạn thực hiện chính xác điều đó:
db.getCollection('example').aggregate([
{ "$match": { "example":1 } },
{ "$project": { "_id": { "$toString": "$_id" } } }
])
Cách sử dụng chính rất có thể sẽ là sử dụng _id
giá trị như một "khóa" trong tài liệu.
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"] }
}
}
}
}]
]
}
}}
])
Cái nào sẽ trả về:
{
"5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}
Trong đó hiển thị rõ ràng chuỗi, cũng như ví dụ khác.
Nói chung, mặc dù thường có một cách để thực hiện "chuyển đổi" trên con trỏ khi tài liệu được trả về từ máy chủ. Đây thường là một điều tốt vì ObjectId
là một biểu diễn nhị phân 12 byte thay vì "chuỗi" 24 ký tự hex, chiếm nhiều không gian hơn.
Vỏ có .map()
phương pháp
db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
Và NodeJS có Cursor.map()
có thể làm được nhiều điều tương tự:
let cursor = db.collection('example').find()
.map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
while ( await cursor.hasNext() ) {
let doc = cursor.next();
// do something
})
Và phương pháp tương tự cũng tồn tại trong các trình điều khiển khác (không phải PHP), hoặc bạn có thể chỉ cần lặp lại con trỏ và chuyển đổi nội dung có nhiều khả năng là điều tốt nhất nên làm.
Trên thực tế, toàn bộ kết quả con trỏ có thể được giảm bớt thành một đối tượng một cách dễ dàng bằng cách chỉ cần thêm vào bất kỳ câu lệnh trả về con trỏ nào, khi làm việc trong shell
.toArray().reduce((o,e) => {
var _id = e._id;
delete e._id;
return Object.assign(o, { [_id]: e })
},{ })
Hoặc đối với các môi trường hỗ trợ JavaScript ES6 đầy đủ như nodejs:
.toArray().reduce((o,({ _id, ...e })) => ({ ...o, [_id]: e }),{ })
Những thứ thực sự đơn giản mà không phức tạp về những thứ cần xử lý trong khuôn khổ tổng hợp. Và rất có thể bằng bất kỳ ngôn ngữ nào bằng nhiều cách tương tự.