sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB föredraget schema för inbäddade samlingar. dokument kontra matriser

I ditt första tillvägagångssätt kan du inte indexera id-fälten, eftersom id används som nyckel. Dess typ av agera som nyckelvärdeslexikon. Det här tillvägagångssättet är användbart om du har den kända uppsättningen ID (naturligtvis mindre antal). Anta att i ditt första exempel är ID:t välkänt längst fram ,

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

så för att hitta värdena för id-fältet idk73716 kan du göra detta genom att

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

den tomma {} anger frågan, och den andra delen {'lines.idk73716':1} är en frågeväljare.

att ha ID som nycklar med fördelen att välja det specifika fältet enbart. Även om {'lines.idk73716':1} är en fältväljare, fungerar den här som en fråga och väljare. men detta kan inte göras i ditt andra tillvägagångssätt. Anta att den andra samlingen är ungefär så här

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

Och du indexerade fält-id, så om du vill fråga 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"
    }
] }
> 

genom att se ovanstående utdata, är det synligt att det inte finns något sätt att välja de matchande sub(inbäddade) dokumenten ensam, men det är möjligt i den första metoden. Detta är standardbeteendet för mongodb.

se

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

kommer att hämta alla rader, inte bara idk73716

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

Hoppas detta hjälper

REDIGERA

Tack till @Gates VP för att påpeka

Vi kan fortfarande använda $exists för att fråga id, men det kommer inte att kunna indexeras



  1. Twitter-liknande app som använder MongoDB

  2. JedisPoolConfig kan inte tilldelas till GenericObjectPoolConfig

  3. Kombinera två $or-påståenden

  4. MongoDB dra element från array två nivåer djup