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

Как да създадете ново поле за масив с агрегатната рамка

В съвременните издания на MongoDB най-ефективният начин е просто да нотирате масива, като използвате съществуващите свойства на документа. Директната нотация на масивите беше въведена в MongoDB 3.2:

db.collection.aggregate([
  { "$project": {
    "lat": 1,
    "long": 1,
    "geometry": {
      "type": { "$literal": "Point" },
      "coordinates": [ "$lat", "$long" ]
    }
  }},
  { "$out": "newcollection" }
])

Или дори да използвате $addFields просто да „добавите“ новото свойство към документите:

db.collection.aggregate([
  { "$addFields": {
    "geometry": {
      "type": { "$literal": "Point" },
      "coordinates": [ "$lat", "$long" ]
    }
  }},
  { "$out": "newcollection" }
])

Ако използвате MongoDB 2.6 и по-нова версия, можете да направите това с рамката за агрегиране и да избегнете зацикляне на резултатите във вашата клиентска програма, за да създадете нова колекция.

Основната функция тук, която ви помага, е $ извън оператор за изпращане на изхода към нова колекция. Но също така да сте малко умен, за да създадете масива, от който се нуждаете.

db.collection.aggregate([
    { "$project": {
        "lat": 1,
        "long": 1,
        "type": { "$literal": ["lat","long"] }
    }},
    { "$unwind": "$type" },
    { "$group": {
        "_id": "$_id",
        "lat": { "$first": "$lat" },
        "long": { "$first": "$long" },
        "coordinates": {
            "$push": {
                "$cond": [
                    { "$eq": [ "$type", "lat" ] },
                    "$lat",
                    "$long"
                ]
            }
        }
    }},
    { "$project": {
        "lat": 1,
        "long": 1,
        "geometry": { 
            "type": { "$literal": "Point" },
            "coordinates": "$coordinates"
        }
    }},
    { "$out": "newcollection" }
])

Така че това използва $literal оператор, за да укажете нов масив в началото на конвейера. Този оператор ще постави съдържание в свойството на документа точно как се доставя. Така че не са разрешени замествания на променливи, следователно "буквал".

За да създадем масива "coordintes", ние просто развиваме този първи масив, който по същество създава два от всеки документ с различна стойност в "type". След това това се използва в $group етап до условно $push или стойността "$lat" или "$long" върху този масив.

Накрая използвайте $project отново, за да финализирате структурата на документа и след това $out изпраща целия изход към новата колекция.

Обърнете внимание, че това има смисъл само ако намерението ви е да създадете нова колекция и да избегнете изпращането на трафик „по кабела“. Това не може да се използва само в рамката за агрегиране, за да оформите отново вашия документ с намерението след това да направите „геопространствена“ заявка в същия конвейер за агрегиране, тъй като „геопространствените“ заявки ще работят само когато действително са индексирани в колекция .

Така че това може да ви помогне да създадете нова колекция, както искате, но поне служи като пример (или всъщност два примера) за това как да създадете масив от различни стойности с рамката за агрегиране.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. грешка:тип параметър `D` трябва да се използва като параметър на типа за някакъв локален тип

  2. Основни заявки между дати $gte, $lte и т.н

  3. MongoDB dropIndex()

  4. Как да актуализирате множество елементи на масив в mongodb

  5. Как да премахнете всички елементи от колекция MongoDB