MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB предпочитана схема за вградени колекции. документи срещу масиви

При първия си подход не можете да индексирате полетата за id, тъй като id се използва като ключ. Действа като речник на ключовите стойности. Този подход е полезен, ако имате известния набор от идентификатори (разбира се, по-малък брой). Да приемем, че в първия ви пример идентификаторът е добре известен отпред,

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

така че за да намерите стойностите за id поле idk73716, можете да направите това чрез

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

празният {} обозначава заявката, а втората част {'lines.idk73716':1} е селектор на заявка.

имащи идентификатори като ключове, които имат предимството да избират само конкретното поле. Въпреки че {'lines.idk73716':1} е селектор на поле, тук той служи като заявка и селектор. но това не може да се направи във вашия втори подход. Да приемем, че втората колекция е нещо като това

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

И индексирахте id на полето, така че ако искате да правите заявка по 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"
    }
] }
> 

виждайки горния изход, се вижда, че няма начин да изберете само съвпадащите под(вградени) документи, но е възможно при първия подход. Това е поведението по подразбиране на mongodb.

вижте

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

ще извлече всички редове, а не само idk73716

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

Надявам се това да помогне

РЕДАКТИРАНЕ

Благодарение на @Gates VP за посочване

Все още можем да използваме $exists за заявка за идентификатора, но той няма да може да се индексира



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. db.collection.count() връща много повече документи за шардирана колекция в MongoDB

  2. Данни за присъединяване към Mongoose

  3. mongodb премахва всички дати, по-малки от посочените

  4. Персонализирано съобщение за грешка на модел Mongoose за Enum

  5. MongoDB пълнотекстово търсене с haskell драйвер