sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB preferovalo schéma pro vložené kolekce. dokumenty vs. pole

Ve vašem prvním přístupu nemůžete indexovat pole id, protože id se používá jako klíč. Svým způsobem působí jako slovník klíčových hodnot. Tento přístup je užitečný, pokud máte známou sadu id (samozřejmě menší počet). Předpokládejme, že ve vašem prvním příkladu je id dobře známé na začátku,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

Chcete-li tedy najít hodnoty pro pole id idk73716, můžete to provést pomocí

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

prázdné {} označuje dotaz a druhá část {'lines.idk73716':1} je selektor dotazu.

mají id jako klíče a mají výhodu vybrat konkrétní pole samostatně. I když je {'lines.idk73716':1} selektorem polí, zde slouží jako dotaz a selektor. ale to nelze udělat ve vašem druhém přístupu. Předpokládejme, že druhá kolekce je podobná této

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

A indexovali jste id pole, takže pokud chcete dotazovat podle id

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

když vidíte výše uvedený výstup, je vidět, že neexistuje způsob, jak vybrat odpovídající dílčí (vložené) dokumenty samostatně, ale je to možné v prvním přístupu. Toto je výchozí chování mongodb.

viz

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

načte všechny řádky, nejen idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Doufám, že to pomůže

UPRAVIT

Díky @Gates VP za upozornění

Stále můžeme použít $exists k dotazu na id, ale nebude indexovatelné



  1. MongoDB/Meteor:Přidejte jedinečné ID ke každému prvku pole

  2. MongoDB Mongoose vybírá dokumenty mezi časovým obdobím

  3. Aggregate $lookup nevrací prvky původní pořadí pole

  4. Jsou operace redis na datových strukturách bezpečné pro vlákna