MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Schéma préféré de MongoDB pour les collections intégrées. documents vs tableaux

Dans votre première approche, vous ne pouvez pas indexer les champs id, car id est utilisé comme clé. Son genre d'agir comme un dictionnaire de valeur clé. Cette approche est utile si vous avez l'ensemble connu d'identifiants (bien sûr moins de nombre). Supposons que dans votre premier exemple, l'identifiant est bien connu à l'avant,

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

donc pour trouver les valeurs du champ id idk73716, vous pouvez le faire en

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

le {} vide indique la requête et la deuxième partie {'lines.idk73716':1} est un sélecteur de requête.

avoir des identifiants comme clés ayant l'avantage de choisir seul le champ particulier. Même si {'lines.idk73716':1} est un sélecteur de champ, il sert ici de requête et de sélecteur. mais cela ne peut pas être fait dans votre deuxième approche. Supposons que la deuxième collection soit un peu comme ça

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

Et vous avez indexé l'identifiant du champ, donc si vous souhaitez interroger par identifiant

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

en voyant la sortie ci-dessus, il est visible qu'il n'y a aucun moyen de sélectionner les documents sous-(intégrés) correspondants seuls, mais c'est possible dans la première approche. C'est le comportement par défaut de mongodb.

voir

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

récupérera toutes les lignes, pas seulement idk73716

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

J'espère que cela vous aidera

MODIFIER

Merci à @Gates VP pour signaler

Nous pouvons toujours utiliser $exists pour interroger l'identifiant, mais il ne sera pas indexable