2015-12-14 15 views
17

Pracuję nad aplikacją meteorytów z pakietem meteorytów. Chcę zmienić pozycję elementu w tablicy dokumentów mongo. Aby to osiągnąć, I $pull go z tablicy, a następnie $push go w określonej pozycji index zgodnie z mongoDB documentation.

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

Meteor/Mongo wyrzuca następujący błąd:

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

raz pierwszy wdrożone tej stronie klienta. Zakładałem, że to nie działa ze względu na ograniczenia minimongo.

Napisałem metodę obsługi tej strony serwera, ale kończę z tym samym błędem.

Co jest nie tak z tym żądaniem, czy meteor może obsługiwać operatora $?


EDIT: Próbowałem wstawić go bezpośrednio w robomongo, i to działało. Wersja Mongo, podczas wpisywania db.version() powraca 2.6.7


* EDIT2: Nie spodziewałem się tak nie sprawdzałem wcześniej: działa aktualizacja, zarówno z $pull i $push. Jednak nawet jeśli dane są rzeczywiście aktualizowane, nadal pojawia się błąd.


* EDIT: Oto przykład dane:

{ 
    "_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 jest tablica my_array gdzie ja wyciągnąć i wsunąć my_item.id w pozycji index

+2

Jaka jest wersja twojego serwera MongoDB? – JohnnyHK

+0

Spróbuj wykonać to samo polecenie w kliencie powłoki 'mongo'. –

+0

@DmytroShevchenko Ta sama komenda działa dobrze w RoboMongo (odpowiednik powłoki klienta, jak sądzę). – Billybobbonnet

Odpowiedz

5

Jeśli utworzysz Meteor kolekcji z new Mongo.Collection('col') otrzymujesz z powrotem instancję Minimongo, która nie jest natywnym MonodeDriver Node, prawda?

Więc niektóre metody nie działają lub nie w pełni obsługiwany .. jak collection.aggregate

Ale można łatwo uzyskać dostęp do natywnego sterownika poprzez Col.rawCollection() i wykonać zapytanie bezpośrednio na natywnej instancji. Natywna instancja jest dostępna tylko na serwerze, oczywiście.

więc robić to, co chcesz zrobić, masz kilka sposobów, na przykład można najpierw wziąć tablicę, uciekać się go jak chcesz i

$set: {my_array: sortedArray } Osobiście wolałbym ten sposób, ponieważ trzeba zrobić tylko jedną operacja aktualizacji zamiast dwóch ($pull & $push at $position)

Ale jeśli chcesz zrobić to wcisnąć w $ $ pozycja sposób .. po prostu zrobić to z natywnego sterownika

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

Uwaga: Musisz Meteor.wrapAsync ze względu na styl synchronizacji Meteor, możesz to zrobić bez niego.Collection.rawCollection(). Update (...)

+0

Dziękuję za poradę dotyczącą używania natywnego sterownika mongo z meteoru. Jednak to nie działa. Nie rozumiem tego. Ten sam błąd z twoją techniką. Wygląda na to, że przyczyną jest identyfikator w '$ each'. Jednak sprawdziłem jego typ (ciąg) zi bez umieszczenia go w tablicy, sprawdziłem, czy pasuje do prawdziwej zawartości w bazie danych, i wreszcie sprawdziłem to w bezpośrednim żądaniu mongo. Żądanie Mongo działa, komenda 'update' z meteorytu z kodem w moim pytaniu działa, ale nadal wyzwala wspomniany tam błąd (z lub bez twojej techniki' rawCollection() '). – Billybobbonnet

+0

Prawdopodobnie przełożę się na podejście z '$ set' i zastąpię całą tablicę i prawdopodobnie rozwiąże to problem. Jednak wciąż nie wiem, dlaczego ten błąd występuje i to mnie wkurza :-) – Billybobbonnet

+0

Przepraszam, że pozwalam na zepsucie nagród, zakładam, że otrzymałeś połowę tego. Nie zaznaczę tej odpowiedzi jako zaakceptowanej na wypadek, gdyby ktoś pojawił się z prawdziwą odpowiedzią. Dzięki Tobie i wszystkim komentatorom za pomoc. – Billybobbonnet

Powiązane problemy