2015-12-14 7 views
17

Güncel meteor paketiyle bir meteor uygulamasında çalışıyorum. Bir mongo belge dizisi içindeki bir öğeyi yeniden konumlandırmak istiyorum. Bunu başarmak için $pull dizinin dışına ve $push konumuna göre mongoDB documentation'a göre.

MyCollection.update({_id: my_doc.id}, 
     { 
      $push: 
      { 
      my_array: 
      { 
       $each:[my_item.id], 
       $position:index 
      } 
      } 
     } 
    ) 

Meteor/Mongo aşağıdaki hatayı atar:

update failed: MongoError: Can't canonicalize query: BadValue unknown top level operator: $each

Önce bu istemci tarafında uyguladı. Minimongo sınırlamaları nedeniyle işe yaramadığını düşündüm.

Bu sunucu tarafını işlemek için bir yöntem yazdım, ancak aynı hatayla bitiyorum.

Bu istekte yanlış olan şey, her bir operatör için meteor ele alabilir mi?


DÜZENLEME: Ben robomongo doğrudan eklemek çalıştı ve işe yaradı. Mongo versiyonu db.version() döner


2.6.7 yazarak * EDIT2: $pull ve $push ile hem güncelleme çalışır: Ben bu yüzden önce kontrol etmedi bunu beklemiyorduk. Ancak, veriler gerçekten güncellenmiş olsa bile, hala hatayı alıyorum.


* DÜZENLEME:

{ 
    "_id" : "oSNrpgAAu8BuznvD6", 
    "name" : "tynhjderjye", 
    "description" : "", 
    "notes" : "", 
    "display_notes" : false, 
    "keywords" : [ 
     "" 
    ], 
    "owner" : "mA5Y7LBCoRyeSDkaG", 
    "createdAt" : ISODate("2015-10-27T13:59:06.083Z"), 
    "createdBy" : "C3i9oj4eapyttHZj6", 
    "contributors" : [ 
     "C3i9oj4eapyttHZj6" 
    ], 
    "medias" : [ 
     "TcFqermNY4y5cjBG3", 
     "dbkNN2rxXJXth8urw", 
     "jML4JKkRoKxx8sLwu", 
     "LEWYsnPrXRSH6MPkX" 
    ], 
    "modifiedAt" : ISODate("2015-11-17T09:35:50.303Z"), 
    "modifiedBy" : "C3i9oj4eapyttHZj6", 
    "chunks" : [ 
     "qCCHKJDbdTLEFR5Yt", 
     "ySiM7dcxvduEM2npj", 
     "5q46vqrmYttscitiK" 
    ], 
    "trashed" : ISODate("2015-11-17T09:35:50.303Z") 
} 

chunks ben çekin ve bir meteor Collection ile oluşturursanız pozisyon index

+2

MongoDB sunucunuzun sürümü nedir? – JohnnyHK

+0

Aynı komutu "mongo" kabuk istemcisinde çalıştırmayı deneyin. –

+0

@DmytroShevchenko Aynı komut, RoboMongo'da (sanırım kabuk istemcisine eşdeğer) iyi çalışıyor. – Billybobbonnet

cevap

5

de my_item.id itmek dizi my_array: İşte bazı örnek veridir new Mongo.Collection('col'), yerel Node MongoDriver olmayan bir Minimongo örneğini geri alırsınız, değil mi?

Yani bazı yöntemler işe yaramayan veya tamamen desteklenmez .. collection.aggregate

gibi Ancak kolayca Col.rawCollection() aracılığıyla yerli sürücüsüne erişin ve yerli örneğinde doğrudan sorgu yapabilirsiniz. Yerel örnek yalnızca sunucuda kullanılabilir, tabiki. Yani

, size ilk dizi alabilir örneğin, çeşitli yollar var istediğini yapmak istediğiniz nasıl çare ve yalnızca birini yapmak gerekir çünkü

$set: {my_array: sortedArray } Şahsen ben bu şekilde tercih ediyorum bunu $ pozisyon şekilde de $ itmek yapmak istiyorsanız iki yerine güncelleme işlemi ($pull & $push at $position)

Ama .. sadece yerli sürücüsü ile bunu

var col = Collection.rawCollection(); 
var result = Meteor.wrapAsync(col.update.bind(col)(
    /* update query goes here */ 
); 

Not: Meteor senkronizasyon stili nedeniyle Meteor.wrapAsync dosyasına ihtiyacınız var, bunu da dışarıda yapabilirsiniz.Collection.rawCollection(). Update (...)

+0

Yerli mongo sürücüsünü meteor'dan kullanmaya dair ipucu için teşekkür ederiz. Ancak, bu çalışmıyor. Anlamadım. Tekniğinizle aynı hata. Görünüşe göre, '$' deki kimlik sebebi. Bununla birlikte, bir diziye koymadan ve yazmadan onun türünü (dizgisi) kontrol ettim, veritabanında gerçek bir içerikle eşleştiğini kontrol ettim ve sonunda doğrudan bir mongo isteğinde kontrol ettim. Mongo istekleri, 'update' komutunu meteor'dan sorularımdaki kodla çalıştırır, fakat yine de orada ('rawCollection()' tekniği ile ya da olmadan) belirtilen hatayı tetikler. – Billybobbonnet

+0

Muhtemelen '$ set' ile bir yaklaşıma geçeceğim ve tüm diziyi değiştireceğim ve muhtemelen problemi çözecektir. Yine de, bu hatanın neden oluştuğunu hala bilmiyorum ve bu beni rahatsız ediyor :-) – Billybobbonnet

+0

Ödün verdiğim için üzgünüm, yarısını aldığına inanıyorum. Birisinin gerçek cevapla ortaya çıkması halinde kabul edilen bu cevabı işaretlemem. Yardımınız için siz ve tüm yorumcular için teşekkürler. – Billybobbonnet

İlgili konular