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

MongoDB:Комбинирайте данни от множество колекции в една..как?

MongoDB 3.2 вече позволява да се комбинират данни от множество колекции в една чрез етапа на агрегиране на $lookup. Като практически пример, нека да кажем, че имате данни за книги, разделени на две различни колекции.

Първата колекция, наречена books , със следните данни:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe"
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe"
}

И втората колекция, наречена books_selling_data , със следните данни:

{
    "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
    "isbn": "978-3-16-148410-0",
    "copies_sold": 12500
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d28"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 720050
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d29"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 1000
}

Обединяването на двете колекции е просто въпрос на използване на $lookup по следния начин:

db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

След това агрегиране books колекцията ще изглежда по следния начин:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
            "isbn": "978-3-16-148410-0",
            "copies_sold": 12500
        }
    ]
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 720050
        },
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 1000
        }
    ]
}

Важно е да се отбележат няколко неща:

  1. Колекцията „от“, в този случай books_selling_data , не може да се раздели.
  2. Полето „as“ ще бъде масив, както е примерът по-горе.
  3. И двете опции „localField“ и „foreignField“ на етапа $lookup ще бъдат третирани като нулеви за целите на съвпадението, ако не съществуват в съответните им колекции (документите $lookup имат перфектен пример за това).

Така че, като заключение, ако искате да консолидирате и двете колекции, като в този случай имате плоско поле copies_sold с общия брой продадени копия, ще трябва да работите малко повече, вероятно като използвате междинна колекция, която ще, $out до окончателната колекция.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb :Увеличаване на максималните връзки в mongodb

  2. Най-добри практики за архивиране на бази данни

  3. Как да направите заявка с настройки на часовата зона в Mongodb

  4. В Mongo каква е разликата между разделяне и репликация?

  5. Mongoose -- Име на колекцията принудително