MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

mongodb dapatkan _id sebagai string dalam permintaan pencarian

MongoDB 4.0 menambahkan $convert operator agregasi dan $toString alias yang memungkinkan Anda melakukan hal itu:

db.getCollection('example').aggregate([
  { "$match": { "example":1 } },
  { "$project": { "_id": { "$toString": "$_id" } } }
])

Penggunaan utama kemungkinan besar adalah menggunakan _id nilai sebagai "kunci" dalam dokumen.

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"] }
              }
            }
          }
        }] 
      ]
    }
  }}
])

Yang akan kembali:

{ 
  "5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}

Yang dengan jelas menunjukkan string, seperti halnya contoh lainnya.

Umumnya meskipun biasanya ada cara untuk melakukan "transformasi" pada kursor saat dokumen dikembalikan dari server. Ini biasanya merupakan hal yang baik karena ObjectId adalah representasi biner 12-byte sebagai lawan dari "string" hex 24 karakter yang membutuhkan lebih banyak ruang.

Shell memiliki .map() metode

db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )

Dan NodeJS memiliki Cursor.map() yang dapat melakukan banyak hal yang sama:

let cursor = db.collection('example').find()
    .map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));

while ( await cursor.hasNext() ) {
  let doc = cursor.next();
  // do something
})

Dan metode yang sama juga ada di driver lain (tidak hanya PHP ), atau Anda bisa mengulangi kursor dan mengubah konten seperti yang mungkin merupakan hal terbaik untuk dilakukan.

Faktanya, seluruh hasil kursor dapat direduksi menjadi satu objek dengan sangat mudah hanya dengan menambahkan pernyataan pengembalian kursor, saat bekerja di shell

.toArray().reduce((o,e) => { 
  var _id = e._id;
  delete e._id;
  return Object.assign(o, { [_id]: e })
},{ })

Atau untuk lingkungan pendukung JavaScript ES6 lengkap seperti nodejs:

.toArray().reduce((o,({ _id, ...e })) =>  ({ ...o, [_id]: e }),{ })

Hal-hal yang sangat sederhana tanpa kerumitan apa yang perlu diproses dalam kerangka agregasi. Dan sangat mungkin dalam bahasa apa pun dengan cara yang hampir sama.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Apakah ada cara untuk memulihkan dokumen yang baru dihapus di MongoDB?

  2. Menampilkan Enkripsi Cadangan untuk MySQL, MongoDB &PostgreSQL - ClusterControl 1.5.1

  3. Tidak dapat terhubung ke MongoDB Atlas (queryTxt ETIMEOUT)

  4. MongoDB $keDesimal

  5. Cara Menggabungkan Dokumen saat Mengimpor File ke MongoDB