MongoDB přesunout data do dokumentů mezi sbírkami

0

Otázka

Potřebuji přesunout data mezi sbírek, jako byly dříve navrženy s použitím relační model v mysli, a máme nějaké vyhledávání výkonem. Všimněte si, že údaje uvedené je pouze příklad a já potřebuju, aby to pro velký soubor dat. Datová struktura je následující:

// Collection person
{
   _id: <object_id>
   ...other data
}
// Collection employments
{
    _id: <object_id>
    person_id: <person_id>,
    ... other data,
}

Teď musím přesunout všechny data z employments kolekce person kolekce založené na person_id a employment_id. A nebudu mazání employments kolekce, jak jsem také muset přesunout některé z metadat person kolekce employment sbírka vzhledem k některým usecases.

Edit:

A person může mít více employments. Takže budu muset vyměnit všechny ids uvnitř person aktuální employments data. Také zaměstnanost má person_id který musí být nahrazen(můžete vytvořit novou vlastnost říci person namísto nahrazení person_id), některé metadat person(např. jméno, e-mail..).

$sloučit vypadá slibně. Bude třeba to vyzkoušet. Se mi zdá matoucí.

Příklad výsledku, který si přeje:

Dokumenty ve dvou sbírkách vypadat jako níže:

Osoba Kolekce

{
  "_id": "619cf3045ce7329d6a8c059c",
  "name": "John Doe",
  "email": "[email protected]",
  "contact": 1234567890
}

Pracovní Kolekce

// Two documents related to person above
  // Document one
  {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Owner",
    "yearly_income": 10000000
  }
  // Document two
  {
    "_id": "619cf912374db5aec2ceb6de",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Salary",
    "yearly_income": 12340000
  }

Očekávaný výsledek pro osobu sbírka bude aktualizován

{
  "_id": "619cf3045ce7329d6a8c059c",
  "name": "John Doe",
  "email": "[email protected]",
  "contact": 1234567890,
  "employments": [
    {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Owner",
    "yearly_income": 10000000
    },
    {
      "_id": "619cf912374db5aec2ceb6de",
      "person_id": "619cf3045ce7329d6a8c059c",
      "employment_type": "Salary",
      "yearly_income": 12340000
    }
  ]
}

Očekávaný výsledek pro zaměstnanost sbírka bude aktualizován

Poznámka: employment_type a yearly_income nejsou potřeba, když kolekce je aktualizováno(lze odstranit)

  // Document one
  {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "person": {
      "_id": "619cf3045ce7329d6a8c059c",
      "name": "John Doe",
      "email": "[email protected]",
      "contact": 1234567890
    }
  }
  // Document two
  {
    "_id": "619cf912374db5aec2ceb6de",
    "person_id": "619cf3045ce7329d6a8c059c",
    "person": {
      "_id": "619cf3045ce7329d6a8c059c",
      "name": "John Doe",
      "email": "[email protected]",
      "contact": 1234567890
    }
  }

Jakékoliv řešení, poněkud blízko to je velmi přijatelné.

1

Nejlepší odpověď

1

Zkuste tohle:

db.person.aggregate([
   {
      $lookup: {
         from: "employment",
         localField: "_id",
         foreignField: "person_id",
         as: "employments"
      }
   },
   { $merge: { into: "person" } }
])

Pokud chcete upravit kolekce employment pak použijte to takhle:

db.person.aggregate([
   {
      $lookup: {
         from: "employment",
         localField: "_id",
         foreignField: "person_id",
         pipeline: [{ $unset: ["employment_type", "yearly_income"] }],
         as: "employments"
      }
   },
   { $merge: { into: "person" } }
])
2021-11-23 20:08:59

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................