2012-09-09 27 views
6

Kullanıcı başına bir öğenin listesini (Node.js ortamında MongoDB ile MongoDB'de) ve bir öğenin bir kullanıcıya ait olup olmadığını görmek için daha sonra sorgulamak istediğimi söyleyelim. Örneğin, her kullanıcının favori renklerini saklamak ve daha sonra belirli bir rengin belirli bir kullanıcıya ait olup olmadığını görmek istiyorum. Bana öyle geliyor ki, kullanıcı belgesindeki bir diziden ziyade renkleri, kullanıcı belgesinde gömülü bir nesne olarak saklamak daha iyi olurdu. Ben yineleme yapmak zorunda bir dizi KarşıMongoDB dizileri vs nesnelerine

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

: Sadece nesne mülkü olup olmadığını görmek için kontrol edebilirsiniz gibi bir renk bir nesne olup olmadığını görmek için kontrol etmeyi daha verimli görünüyor olmasının nedeni

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

Ancak, çevrimiçi gördüğüm örneklerden birçoğundan, bu şey bu tip diziler kullanmak gibi görünüyor oldukça yaygındır: renk dizide yerde varsa tüm dizi görmek için. Bir şey mi eksik? Artıları/eksileri ve bunu yapmanın en iyi yolu nedir?

+1

Bu önerilere herhangi bir link verebilir misiniz? – c69

cevap

2

Renkler bir dizi olarak saklanırsa bir döngü kullanmak zorunda değilsiniz. Sadece olduğu gibi indexOf kullanabilirsiniz: bahsedilen

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

, gerçekten katıştırılmış belgeyi veya diziyi kullanmak ister her iki şekilde önemli olmamalı; Birine benzemiyor ya da diğeri büyük bir performans avantajı verecek.

+0

'bir diğeri büyük bir performans avantajı vermeyecek gibi değil. Bu doğru mu?! Ve eğer öyleyse, hangi ölçekte. Sadece 8 renk varsa, bir kez göz ardı edilir. Ama birçok renk hakkında, ya da birçok kez bir döngüde erişilen? –

1

Bu tür bilgileri MongoDB koleksiyonlarında saklamak için kullanılan gömülü dizileri sık sık görüyorsunuz, çünkü dizi özelliğine bir dizin eklerseniz, sorgulamada etkili olurlar ve doğal bir sözdizimi kullanırlar. Tek tek renk özellikleri ile bu yaptıysak

db.users.find({id: 1, colors: 'yellow'}) 

Böyle bir daha garip görünümlü sorgu olurdu ve şimdi etsen: aşağıdaki gibi bu durumda bir şey (a renkler dizisi özelliği içeren bir kullanıcılar toplama varsayılarak) Her rengi ayrı ayrı dizmek zorundasınız (yukarıdaki gibi sadece colors yerine):

db.users.find({id: 1, 'colors.yellow': true})