MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

mongodb получава _id като низ в заявката за намиране

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 }),{ })

Наистина прости неща без сложността на това, което трябва да се обработва в рамката за агрегиране. И много възможно на всеки език чрез почти същите средства.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Размито търсене с Mongodb?

  2. запишете IP адрес в mongoDB

  3. сортиране по дължина на низа в Mongodb/pymongo

  4. Премахнете запис от масив с помощта на драйвер MongoDB-Java

  5. Актуализирането на пътя 'x' ще създаде конфликт при 'x'