2015-12-14 7 views
17

私は最新流行の流星群を使って流星群に取り組んでいます。 mongoドキュメント配列内のアイテムの位置を変更したい。それを達成するためには、私はを配列から取り出し、$pushindexポジションのmongoDB documentationでそれを取り出します。

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

流星/モンゴは、次のエラーがスローされます。

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

私が最初にこのクライアント側を実装しました。私はそれが最小限の制限のために動作しないと仮定した。

このサーバー側を処理するメソッドを記述しましたが、同じエラーが発生します。

このリクエストで何が問題なのですか?流星が$演算子を処理できますか?


EDIT:私はrobomongoに直接挿入しようとした、それが働きました。 Mongoのバージョン、db.version()戻り


2.6.7を入力* EDIT2:$pull$pushで両方、更新は動作します:私は、私は前にチェックしていなかったことを期待していませんでした。しかし、データが実際に更新されても、私はまだエラーが発生します。


*編集:ここではいくつかのサンプルデータです:

{ 
    "_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は私が引く配列my_arrayで、あなたが流星のコレクションを作成する場合は、位置index

+2

MongoDBサーバーのバージョンは? – JohnnyHK

+0

'mongo'シェルクライアントで同じコマンドを実行してみてください。 –

+0

@DmytroShevchenko同じコマンドがRoboMongo(私が推測するシェルクライアントに相当)で正常に動作します。 – Billybobbonnet

答えて

5

my_item.idを押しますnew Mongo.Collection('col')あなたは元のノードMongoDriverではないMinimongoのインスタンスを返すでしょうか?

だから、いくつかの方法がうまく動作しないか、完全にはサポートされていません。.. collection.aggregate

のようなしかし、あなたは簡単にCol.rawCollection()経由でネイティブドライバにアクセスし、ネイティブインスタンス上で直接クエリを実行することができます。 ネイティブインスタンスは、サーバ上でのみアクセス可能です。もちろん、です。だから、

は、あなたは、あなたが最初の配列を取ることができる例えば、いくつかの方法を持っているやりたいあなたが望むどのようにそれを訴えると、あなただけのいずれかを実行する必要があるため

$set: {my_array: sortedArray } は個人的に私はこの方法を好むだろうあなたはそれを$ポジション道で$プッシュを行いたい場合は代わりに2の更新操作($pull & $push at $position

しかし...ちょうどネイティブドライバでそれを行う

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

注:Meteorの同期スタイルのためにMeteor.wrapAsyncが必要です。Collection.rawCollection()。更新(...)

+0

流星からのネイティブmongoドライバの使用についてのヒントをありがとう。しかし、これは動作していません。理解できません。あなたのテクニックにも同じエラーがあります。 '$ each'のidが原因であるようです。しかし、型(文字列)を配列の中に入れて、入れずにチェックしたところ、データベースの中身が一致していることを確認し、最後にmongoの直接要求でチェックしました。 Mongoのリクエストがうまく動作していて、質問の中のコードでmeteorの 'update'コマンドが動作しますが、そこに記述されているエラー(' rawCollection() '技法の有無にかかわらず) – Billybobbonnet

+0

私はおそらく '$ set'を使ってアプローチに切り替え、配列全体を置き換えて、おそらく問題を解決します。しかし、私はまだこのエラーがなぜ発生するのか分かりませんし、それは私を悩ましています:-) – Billybobbonnet

+0

申し訳ありませんが、賞金を失うために、私はあなたの半分が授与されたと仮定します。誰かが本当の答えを示す場合、私はこの答を受け入れたものとしてマークしません。あなたとみなさんの助けをいただきありがとうございます。 – Billybobbonnet

関連する問題