sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB foretrukne skema til indlejrede samlinger. dokumenter vs. arrays

I din første tilgang kan du ikke indeksere id-felterne, da id bruges som nøgle. Dens slags fungerer som nøgleværdiordbog. Denne tilgang er nyttig, hvis du har det kendte sæt af id'er (selvfølgelig mindre antal). Antag i dit første eksempel, at id'et er velkendt foran ,

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

så for at finde værdierne for id-feltet idk73716, kan du gøre dette ved at

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

den tomme {} angiver forespørgslen, og den anden del {'lines.idk73716':1} er en forespørgselsvælger.

at have id'er som nøgler med en fordel ved at vælge det bestemte felt alene. Selvom {'lines.idk73716':1} er en feltvælger, fungerer den her som en forespørgsel og vælger. men dette kan ikke gøres i din anden tilgang. Antag, at den anden samling er sådan her

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

Og du indekserede felt-id'et, så hvis du vil forespørge efter 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"
    }
] }
> 

ved at se ovenstående output, er det synligt, at der ikke er nogen måde at vælge de matchende under(indlejrede) dokumenter alene, men det er muligt i den første tilgang. Dette er standardadfærden for mongodb.

se

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

vil hente alle linjer, ikke kun idk73716

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

Håber dette hjælper

REDIGER

Tak til @Gates VP for at påpege

Vi kan stadig bruge $exists til at forespørge på id'et, men det vil ikke kunne indekseres



  1. er kort/reducer passende til at finde medianen og tilstanden for et sæt værdier for mange poster?

  2. Er dette en god use-case for Redis på en ServiceStack REST API?

  3. Redis - Udløbne indekser slettes ikke

  4. Opdaterer meteor mongodb-versionen automatisk?