2010-08-13 21 views
8

'daki alt alt dizi öğeleri nasıl ayarlanmalıyım Bir portal-ish bileşeni olan bir webapp geliştiriyorum (sütuntan sütuna kadar sütun olabilir ve eklenebilir veya kaldırılabilir çoklu paneller gibi düşünün). BenMongoDB

{ 
    _id: ObjectId(...), 
    title: 'My Layout', 
    columns: [ 
     { 
      order: 1, 
      width: 30, 
      panels: [ 
       { title: 'Panel Title', top: 100, content: '...' }, 
       { title: 'Panel Title', top: 250, content: '...' }, 
      ] 
     }, 
     { 
      ... multiple columns ... 
     } 
    ] 
} 

ben güncelleme() ile atomik/değiştirici işlemlerini kullanmak çalışılıyor ve bu kafa karıştırıcı oluyor ... Bunun gibi bir biçimi ile bu bilgileri depolamak için MongoDB kullanıyorum. Belirli bir panelin bir özelliğini güncellemek istediysem, buna nasıl başvurabilirim?

update(
    { _id: ObjectId(...) }, 
    { $set: { columns.[???].panels.[???].top: 500 } 
) 

cevap

14

Dizideki dizini biliyorsanız, dizi öğesine doğrudan nokta gösterimi ile erişebilirsiniz.

update(
{ _id: ObjectId(xxxx) }, 
{ $set: { 'columns.0.panels.0.top' : 125}} 
) 

Nokta ile işaretli yolu tırnak işareti olarak tırnak içine aldığınızdan emin olun.

Düzenleme:

bu dinamik işe yarayabilir konusunda daha fazla ayrıntı vermek gerekirse, PHP bir örnek vereyim:

$action = array("columns.$colNum.panels.$panelNum" => $newValue); 

Evet positional operator yoktur, ancak does not appear to be advanced enough değiştirmek diziler içindeki diziler, bu MongoDB'de değişebilir. 1.7.0

Bu bilgiyi iç içe geçmiş bir belgeye yerleştirmek yerine yapabileceğiniz bir alternatif var. Düzleştirmeye çalış.

kolon nesnesini:: Paneli & sütun nesneleri olan bir koleksiyon oluşturabilir

{ 
_id: // MongoId 
type: 'column', 
user: 'username', 
order: 1, 
width: 30, 
} 

paneli nesnesi:

{ 
_id: //MongoId 
type: 'panel', 
user: 'username', 
parentColumn: //the columns _id string 
top: 125, 
left: 100 
} 

Sonra yaparak bir kullanıcıya ait tüm sütunları bulabilirsiniz:

find({ type: 'column', user:'username'}); 

Belirli bir sütunun tüm panellerini aşağıdakileri yaparak bulabilirsiniz:

find({type: 'panel', columnOwner:'ownerID'}); 

her sütun ve panel kendisine MongoDB tarafından verilen benzersiz bir kimliğe sahip olacağından, kolayca sorgulayabilir ve atomik seçenekleri ayarlayın olabilir.

update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}}); 
+0

kaldırın. Dizinleri kodlamak gerçekten mümkün değil. Hala pozisyon operatörü nasıl kullanılacağını anlamaya çalışıyor http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator – Dex

+0

daha fazla ayrıntı ekledi – Klinky

0

Ben de böyle bir durum vardı, ben yani ne ihtiyaç güncellemek yerine $ çekme eyleminden sonra $ addToSet izledi.

update(
{ _id: ObjectId(...) }, 
{ $addToSet: { columns.$.panels : "new sub-Doc" } 
) 

Ve sonra da bu merak ediyorum eski değerini

update({_id:ObjectId(....)},{$pull : { columns.$.panels : {"top" : 100} }}) 
+0

Sütunlarda $ için ne var? –

+0

"$" Bir güncelleştirmedeki sorgu koşuluna uyan ilk öğeyi güncelleştirmek için bir yer tutucu görevi görür. lütfen https: //docs.mongodb adresine bakın.com/manuel/başvuru/operatör/güncelleme/pozisyonel/# up._S_ – achuth