2011-06-14 6 views
0

Ceci est de MongoDB docs:MongoDB :: Pourquoi les index de documents incorporés Ne pas retourner les documents dans l'ordre inverse?

db.factories.insert({ name: "xyz", metro: { city: "New York", state: "NY" } }); 
db.factories.ensureIndex({ metro : 1 }); 
// this query can use the above index: 
db.factories.find({ metro: { city: "New York", state: "NY" } }); 
//As well as this 
db.factories.find({ metro: { $gte : { city: "New York" } } }); 

// But this query will not return the document because the order of the fields is significant and doesn't match in this case 
db.factories.find({ metro: { state: "NY" , city: "New York" } }); 

Pourquoi l'ordre des documents importants? Parce que dans JSON et BSON l'ordre des champs fait la différence lors de la sérialisation.

Répondre

2

C'est à dire. dans le second cas

{ city: "New York", state: "NY" } 

n'est pas la même chose que

{ state: "NY" , city: "New York" } 

La valeur effectivement indexée sera "New YorkNY" dans le premier cas et "NYNew York" (à peu près). Comme il n'y a aucun moyen de normaliser l'ordre des champs avant de chercher le document incorporé dans l'index.

Pour surmonter cela, vous pouvez utiliser l'indice composé:

db.factories.ensureIndex({ "metro.city": 1, "metro.state": 1 }) 

Et requête avec (ici l'ordre n'a pas d'importance):

db.factories.find({ "metro.city": "New York", "metro.state": "NY" }) 
source de
+0

pour « Parce que dans JSON et BSON l'ordre de les champs font la différence "? – CamelCamelCamel

+0

@Radagaisus c'était une déclaration mal formée. Je voulais dire qu'il fait une différence dans ce contexte (sérialisation et indexation). BSON ou JSON lui-même n'applique aucun ordre et la sémantique de comparaison d'objet est mise en œuvre. – pingw33n

+0

"Puisqu'il n'y a aucun moyen de normaliser l'ordre des champs avant de rechercher le document incorporé dans l'index" ... juste une idée: que diriez-vous de trier les champs par ordre alphabétique (du nom du champ)? –

Questions connexes