sql >> Database >  >> NoSQL >> MongoDB

MongoDB voorkeursschema voor ingesloten collecties. documenten versus arrays

In uw eerste benadering kunt u de id-velden niet indexeren, aangezien id als sleutel wordt gebruikt. Het is een soort van handelen als een sleutelwaardewoordenboek. Deze aanpak is handig als je de bekende set id's hebt (natuurlijk minder aantal).

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

dus om de waarden voor id-veld idk73716 te vinden, kunt u dit doen door

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

de lege {} geeft de query aan en het tweede deel {'lines.idk73716':1} is een queryselector.

met id's als sleutels met het voordeel dat je alleen het specifieke veld kunt kiezen. Hoewel {'lines.idk73716':1} een veldselector is, dient het hier als een query en selector. maar dit kan niet worden gedaan in uw tweede benadering. Stel dat de tweede verzameling er ongeveer zo uitziet

> 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"
    }
] }
> 

En je hebt de veld-ID geïndexeerd, dus als je wilt zoeken op 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"
    }
] }
> 

door de bovenstaande uitvoer te zien, is het zichtbaar dat er geen manier is om de overeenkomende sub (ingebedde) documenten alleen te kiezen, maar het is mogelijk in de eerste benadering. Dit is het standaardgedrag van mongodb.

zie

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

haalt alle regels op, niet alleen idk73716

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

Ik hoop dat dit helpt

BEWERKEN

Met dank aan @Gates VP om erop te wijzen

We kunnen nog steeds $exists gebruiken om de id op te vragen, maar deze zal niet indexeerbaar zijn



  1. Kan ik Tornado+ Selderij+ RabbitMQ + Redis gebruiken?

  2. spring data mongodb mapping dynamisch veld

  3. mongodb kan niet starten op Windows?

  4. Mongodb shell mongo:normaal is slechts één gebruik van elk socketadres (protocol/netwerkadres/poort) toegestaan. voor stopcontact:0.0.0.0:27017