2015-12-14 13 views
17

Io lavoro su un'applicazione meteorica con il bundle di meteoriti aggiornato. Voglio riposizionare un elemento all'interno di un array di documenti mongo. Per ottenere ciò, I $pull dall'array e quindi $push in una posizione specifica index in base a mongoDB documentation.

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

Meteor/Mongo getta il seguente errore:

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

ho implementato questo lato client. Ho pensato che non funzionasse a causa delle limitazioni di minimongo.

Ho scritto un metodo per gestire questo lato server, ma alla fine ho lo stesso errore.

Cosa c'è di sbagliato in questa richiesta, può la meteora gestire l'operatore $ ogni?


EDIT: Ho cercato di inserire direttamente nel robomongo, e ha funzionato. Versione Mongo, quando si digita db.version() ritorna 2.6.7


* EDIT2: Non mi aspettavo così non ho controllato in precedenza: l'aggiornamento funziona, sia con la $pull e la $push. Tuttavia, anche se i dati vengono effettivamente aggiornati, viene comunque visualizzato l'errore.


* EDIT: Ecco alcuni dati esempio:

{ 
    "_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 è la matrice my_array dove mi tirare e spingere i my_item.id nella posizione index

+2

Qual è la versione del server MongoDB? – JohnnyHK

+0

Prova ad eseguire lo stesso comando nel client di shell 'mongo'. –

+0

@DmytroShevchenko Lo stesso comando funziona bene in RoboMongo (equivalente al client shell suppongo). – Billybobbonnet

risposta

5

Se si crea una collezione di meteoriti con new Mongo.Collection('col') si ottiene un'istanza Minimongo che non è il Node MongoDriver nativo, giusto?

Così alcuni metodi semplicemente non funzionano o non completamente supportato .. come collection.aggregate

ma si può facilmente accedere al driver nativo tramite Col.rawCollection() ed eseguire la query direttamente nell'istanza nativo. L'istanza nativa è accessibile solo sul server, ovviamente.

Quindi, per fare ciò che si vuole fare si hanno diversi modi, per esempio si potrebbe in primo luogo prendere l'array, ricorso come si desidera e

$set: {my_array: sortedArray } Personalmente preferirei in questo modo perché è necessario fare solo una operazione di aggiornamento invece di due ($pull & $push at $position)

Ma se si vuole farlo nel $ spinta in modo $ posizione .. basta farlo con il driver nativo

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

Nota: è necessario il Meteor.wrapAsync a causa dello stile di sincronizzazione di Meteor, si potrebbe anche farlo senza di esso.Collection.rawCollection(). Update (...)

+0

Grazie per il suggerimento sull'utilizzo del driver mongo nativo di meteor. Tuttavia, questo non funziona. Non capisco Lo stesso errore con la tua tecnica. Sembra che l'id di '$ each' sia la causa. Tuttavia, ho controllato il suo tipo (stringa) con e senza metterlo in un array, ho controllato che corrisponda a un contenuto reale nel database, e infine ho controllato in una richiesta mongo diretta. La richiesta di Mongo funziona, il comando 'update' da meteora con il codice nella mia domanda funziona, ma attiva comunque l'errore menzionato lì (con o senza la tecnica' rawCollection() '). – Billybobbonnet

+0

Probabilmente passerò ad un approccio con '$ set' e sostituirò l'intero array e probabilmente risolverà il problema. Tuttavia, non so ancora perché questo errore si verifica e mi sta infastidendo :-) – Billybobbonnet

+0

Scusate per aver lasciato il bottino, presumo che ne abbiate ricevuto metà. Non segnerò questa risposta come accettata nel caso qualcuno si presenti con la vera risposta. Grazie a te e a tutti i commentatori per l'aiuto. – Billybobbonnet

Problemi correlati