MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Esquema preferencial do MongoDB para coleções incorporadas. documentos versus matrizes


Em sua primeira abordagem, você não pode indexar os campos id, pois id é usado como chave. Seu tipo de ato como dicionário de valor-chave. Esta abordagem é útil se você tiver o conjunto conhecido de ids (obviamente menos número). Assuma que em seu primeiro exemplo o id é bem conhecido em front ,
>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

então, para encontrar os valores do campo id idk73716, você pode fazer isso
 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

o {} vazio denota a consulta e a segunda parte {'lines.idk73716':1} é um seletor de consulta.

ter ids como chaves com a vantagem de escolher apenas o campo específico. Embora {'lines.idk73716':1} seja um seletor de campo, aqui ele serve como consulta e seletor. mas isso não pode ser feito em sua segunda abordagem. Suponha que a segunda coleção seja mais ou menos assim
> 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"
    }
] }
> 

E você indexou o id do campo, então se você quiser consultar pelo 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"
    }
] }
> 

vendo a saída acima, é visível que não há como escolher os documentos sub (incorporados) correspondentes sozinhos, mas é possível na primeira abordagem. Este é o comportamento padrão do mongodb.

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

irá buscar todas as linhas, não apenas idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Espero que isto ajude

EDITAR

Obrigado a @Gates VP por apontar

Ainda podemos usar $exists para consultar o id, mas não será indexável