2016-04-03 49 views
0

Hangi sorgu daha hızlı olacak? Len ObjectID listesi fazla 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")}} 
     }] 
    }) 

Ben dizinlere sahip olabilir: kişiler, persons.person_id. Önemli olan Django'dan (Mongoengine) sorgu yapıyordum. Şimdilik db'de yaklaşık 100 bin konut ve 2 bin kişi var. Saray belgelerine böyledir:

the documentation belirtildiği gibi
{ 
    "_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

örnek bir belge gösterebilir misiniz? Ayrıca, her zaman 'var start = new Date(). GetTime(); doYouStuff; print (new Date(). getTime() - start) 'farkı veya kullanımı ölçmek için ** [' .explain() '] (https://docs.mongodb.org/manual/reference/method/cursor.explain /) ** –

+0

@MarkusWMahlberg, – vadimb

cevap

3

, $in mümkünse $or yerine kullanılmalıdır.

Ama doğrudan tek bir alana karşı eşleşen konum gibi sorgunuzu basitleştirmek böylece de, $elemMatch kullanmaya gerek yoktur:

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

'u göndermek için bir örnek ekledi, başka bir soru için üzgünüm, ama bu sorguyu ilk önce daha fazla $ çalıştıran Evler'e getirebilir miyim? Ev listemi, ObjectId listemde kurulan person_id sayımına göre sıralamak istiyorum. Mümkün mü? – vadimb

+0

@vadimb Devam edin ve bunu yeni bir soru olarak gönderin. – JohnnyHK

İlgili konular