2011-07-02 7 views
6

Her biri bir alt belge dizisi içeren bir belge koleksiyonum var. Her alt belgenin bir zaman değeri vardır. Alt belgede geçen süreye bağlı olarak bir alt belgeyi iade edip edemeyeceğimi görmeye çalışıyorum.MongoDB sorgusu dizideki bir değere göre bir dizi değeri almak için

ben $ dilim kullanarak bir alt belgeyi alabilir biliyorum, ama $ dilim bana sadece belirli bir dizin veya aralığı ve ofset verir.

Örnek zaman! Ben böyle bir şey geri almak

Belgeler Ben Bul ile bir sorgu yaparsanız ({}, {: {$ dilim [2,1]} subs})

{ 
    id: 1234, 
    type: 'a', 
    subs: [ 
     { time: 123001, val: 'a' }, 
     { time: 123002, val: 'b' }, 
     { time: 123003, val: 'c' } 
    ] 
} 

.... öylesine gibidir :

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]} 

Ben 123.002 zaman değerine dayalı ofset değil tabanlı örneğin söz konusu kaydı almak istiyorum, ama.

Mümkün mü?

Verileri tasarladık gibi

cevap

4

bu mümkün değildir. MongoDB yılında

, sorgular bir belgenin tamamını döndürür. Belirli alanları filtreleyebilirsiniz, ancak bir alanın değeri bir dizi ise, orada durur.

"Nesne dizileri" ne sahip olduğunuzda, $slice'a sahip olmanız gerekir; bu sizin istediğiniz gibi değildir veya verilerinizi farklı şekilde modellemeniz gerekir. Senin durumunda

aşağıdaki yapısının mümkün Sorgunuzla yapacaktır: Ben bir dizi yerine bir JSON nesnesi haline subs değiştirdik nasıl

{ 
    _id: 1234, 
    type: 'a', 
    subs: { 
     '123001': { val: 'a' }, 
     '123002': { val: 'b' }, 
     '123003': { val: 'c' } 
    } 
} 

dikkat edin. Şimdi aşağıdaki sorguyu yapmak ve aradığınız sadece zaman alabilir:

find({ _id: 1234 }, { 'subs.123002': 1 }) 

burada bariz Trade-off belgeyi değiştirmek kullanım şeklini değiştirmek zorunda kalacak olmasıdır. Onun yerine sen {'subs.1234': { $exists:true} } sorgulamak lazım, {'subs.time': 1234} sorgulayamıyor, subs üzerinde $push kullanamazsınız.

+0

Oh duhh! Evet, işe yarayacak. Teşekkür ederim. Söylediklerimi yanlış anlamadığım sürece, bir belgenin bir parçasını döndürebilirsiniz .. http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields Dilimi kullanmadan sadece bir dizinin parçası değil . Teşekkürler! – FredArters

+0

Özgün yapınızı kullanırsanız, dizide üçüncü öğeyi almak için "alt.2" yi kullanabilirsiniz. Ama genellikle üçüncü maddenin gerçekte ne olduğunu bilmiyorsunuz. Yani diziler için, genellikle ya hep ya hiç. –

+1

Soru eskidir, ancak belki bu bir cevap arayan biri için yararlıdır. Dizideki bir belgeyi $ elemMatch ile eşleştirmek mümkündür. http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch – Esteban

İlgili konular