MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

mongodb get _id dưới dạng chuỗi trong truy vấn tìm

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ự.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Multikey Indexes &Index Intersection Bounds

  2. Tự động xóa các đối tượng tham chiếu khi xóa trong MongoDB

  3. Cập nhật mảng lồng nhau bên trong mảng mongodb

  4. Chuyển các lọ bổ sung cho Spark thông qua spark-submit

  5. Cách hoạt động của tham số arrayFilters trong MongoDB