2015-06-11 21 views
6

Bir mongodb belgesindeki bir dizinin içine yerleştirilmiş bir dizinin içeriğine erişirken bir sorun yaşıyorum. Ben içinde yuvalanmış "özellikleri" dizideki bir elemanın özelliklerini değiştirmek için denediğimde derdeMongoDB: dizi içinde bir diziyi güncelleştiriliyor

db.orgs.update({_id: org_id, "groups._id": group_id} , {$set: {"groups.$.name": "new_name"}}); 

olduğunu ... aşağıdaki gibi bir sorgu ile ilk dizi "grupları" erişen sorunumuz yok "grup" dizisi. İşte

bir örnek belge

 { 
     "_id" : "v5y8nggzpja5Pa7YS", 
     "name" : "Example", 
     "display_name" : "EX1", 
     "groups" : [ 
      { 
       "_id" : "s86CbNBdqJnQ5NWaB", 
       "name" : "Group1", 
       "display_name" : "G1", 
       "features" : [ 
        { 
         _id  : "bNQ5Bs8BWqJn6CdNa" 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
        }, 
       ] 
      }, 
     ] 
    }, 

benziyor Ve bu kullanmaya çalıştı sorgu budur.

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "qBX3KDrtMeJGvZWXZ", "groups.features._id":"bNQ5Bs8BWqJn6CdNa" }, {$set: {"groups.$.features.$.name":"New Blog Name"}}); 

Bir hata iletisiyle döndürür:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 2, 
     "errmsg" : "Too many positional (i.e. '$') elements found in path 'groups.$.features.$.name'" 
    } 
}) 

O Mongo pozisyonel eleman vasıtasıyla diziler içinde yuvalanmış diziler değiştirerek desteklemediği görünüyor?

Bu diziyi, tüm şeyi dışarı çıkarmadan, değiştirmeden ve sonra yeniden yerleştirmeden değiştirmenin bir yolu var mı? Bu şekilde çoklu yerleştirme ile yeni bir koleksiyon oluşturmak standart uygulama mı? (Her ne kadar veriler yalnızca ana veriler gerekliyse bile gerekli olsa da) Belge yapısını, ikinci iç içe geçmiş dizinin bir nesne olacak şekilde değiştirmeli ve ona anahtar aracılığıyla erişmeli miyim? Bunu yapmak için "doğru" yolu olarak kabul edilir Ne

groups.$.features.[KEY].name 

(Nerede anahtar bir "_ID" vazifesi görebileceğini bir tamsayı değeridir)?

cevap

3

Biraz araştırma yaptıktan sonra, bir dizideki diziyi değiştirmenin tek yolu, değiştirmek istediğim öğenin dizinini bulmak için bazı dış mantıklarla olur. Bunu yapmak, her değişikliğin, dizini bulmak için bir bulma sorgusuna sahip olmasını ve ardından diziyi değiştirmek için bir güncelleştirme sorgusunu gerektirir. Bu en iyi yol gibi görünmüyor.

Link to a 2010 JIRA case requesting multiple positional elements...

Hep özelliğin kimliğini bilecek yana

, benim belge yapısını revize etmek seçtiniz.

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "s86CbNBdqJnQ5NWaB"}, {$set: {"groups.$.features.1.name":"Blog Test 1"}}); 
: Yeni yapı ile
 { 
    "_id" : "v5y8nggzpja5Pa7YS", 
    "name" : "Example", 
    "display_name" : "EX1", 
    "groups" : [ 
     { 
      "_id" : "s86CbNBdqJnQ5NWaB", 
      "name" : "Group1", 
      "display_name" : "G1", 
      "features" : { 
       "1" : { 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
       }, 
      } 
     }, 
    ] 
}, 

değişiklikler aşağıdaki şekilde yapılabilir