MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

mongodb pobierz _id jako ciąg w zapytaniu wyszukiwania

MongoDB 4.0 dodaje $convert operator agregacji i $toString alias, który pozwala dokładnie to zrobić:

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

Głównym zastosowaniem byłoby najprawdopodobniej użycie _id wartość jako „klucz” w dokumencie.

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

Który zwróci:

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

Co wyraźnie pokazuje ciąg, podobnie jak drugi przykład.

Ogólnie rzecz biorąc, zazwyczaj istnieje sposób na wykonanie "przekształceń" na kursorze, gdy dokumenty są zwracane z serwera. Zwykle jest to dobre, ponieważ ObjectId jest 12-bajtową reprezentacją binarną w przeciwieństwie do 24-znakowego „łańcucha” w systemie szesnastkowym, który zajmuje dużo więcej miejsca.

Powłoka ma .map() metoda

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

NodeJS ma Cursor.map() które mogą zrobić to samo:

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

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

Ta sama metoda istnieje również w innych sterownikach (ale nie w PHP) lub możesz po prostu iterować kursor i przekształcać zawartość, co jest prawdopodobnie najlepszą rzeczą do zrobienia.

W rzeczywistości, całe wyniki kursora można z łatwością zredukować do jednego obiektu, po prostu dodając do dowolnej instrukcji zwracającej kursor podczas pracy w powłoce

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

Lub dla środowisk obsługujących język ES6 JavaScript, takich jak nodejs:

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

Naprawdę proste rzeczy bez złożoności tego, co należy przetworzyć w ramach agregacji. I bardzo możliwe w każdym języku w ten sam sposób.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ostrzeżenie dotyczące łączenia się z MongoDB za pomocą serwera Node

  2. Repozytorium Spring Data Mongo::Wspólna metoda we wszystkich wydaniach Repo

  3. Mongodb aktualizuje głęboko zagnieżdżony subdokument

  4. Niestandardowe kaskadowanie w Spring Data MongoDB

  5. Rejestrowanie zapytań MongoDB za pomocą Spring Boot