2016-04-03 13 views
0

Welche Abfrage wird schneller? Len von ObjectId Liste mehr als 2.

db.house.find(
    { persons: 
     { $elemMatch: 
      { person_id: 
       { $in: 
        [ ObjectId("570028671d41c8eaeb6c9ce8"), 
         ObjectId("570028681d41c8eaeb6c9e38") 
        ] 
       } 
      } 
     } 
    }) 

db.house.find(
    { $or: 
     [{ persons: 
      {$elemMatch: 
       {person_id:ObjectId("570028671d41c8eaeb6c9ce8")}} 
     }, 
     {persons:{$elemMatch:    
       {person_id:ObjectId("570028681d41c8eaeb6c9e38")}} 
     }] 
    }) 

sein kann, ich habe Indizes für: Personen, persons.person_id. Ich mache Anfragen von Django (Mongoengine), wenn es darauf ankommt. Es gibt ungefähr 100k Häuser und 2k Personen in meinem db für jetzt. Haus Dokumente sind wie folgt aus:

{ 
    "_id" : ObjectId("570031aa1d41c8ed54393b19"), 
    "persons" : [ 
     { 
      "person_id" : ObjectId("570028671d41c8eaeb6c9dff"), 
      "t" : "150 t" 
     }, 
     { 
      "person_id" : ObjectId("5700312d1d41c8ed54393b05"), 
      "t" : "1 g" 
     }, 
     { 
      "person_id" : ObjectId("5700312d1d41c8ed54393b06"), 
      "t" : "70 y" 
     } 
    ] 
} 
+0

Können Sie ein Beispieldokument zeigen? Außerdem können Sie immer 'var start = new Date() verwenden. GetTime(); doYouStuff; print (new Date(). getTime() - start) 'um den Unterschied zu messen oder ** [' .explain() '] (https://docs.mongodb.org/manual/reference/method/cursor.explain /) ** –

+0

@MarkusWMahlberg Probe zum Beitrag hinzugefügt – vadimb

Antwort

3

Wie in the documentation erwähnt, sollte $in, wann immer möglich, anstelle von $or verwendet werden.

Aber Sie brauchen auch nicht $elemMatch zu verwenden, wie Sie direkt sind gegen ein einzelnes Feld übereinstimmt, so dass Sie Ihre Abfrage vereinfachen:

db.house.find(
    { 'persons.person_id': 
     { $in: 
      [ ObjectId("570028671d41c8eaeb6c9ce8"), 
       ObjectId("570028681d41c8eaeb6c9e38") 
      ] 
     } 
    }) 
+0

Es tut mir leid für eine andere Frage, aber kann ich diese Abfrage zu ersten Häuser bekommen, wo mehr $ in Arbeit? Ich meine, ich möchte meine Hausliste nach Anzahl der person_id in meiner ObjectId-Liste sortiert haben. Ist es möglich? – vadimb

+0

@vadimb Gehen Sie voran und posten Sie das als neue Frage. – JohnnyHK

Verwandte Themen