17

最新の流星バンドルを使用して、流星アプリケーションに取り組んでいます。mongo ドキュメント配列内のアイテムの位置を変更したい。それを達成するために、私は$pullそれを配列から取り出し、mongoDB documentationに従って$push特定の位置に置きます。index

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

Meteor/Mongo は次のエラーをスローします。

更新に失敗しました: MongoError: クエリを正規化できません: BadValue 不明な最上位演算子: $each

私は最初にこのクライアント側を実装しました。minimongo の制限のために機能しないと思いました。

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

このリクエストの何が問題なのですか? meteor は $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引っ張ったり押したりする配列ですmy_item.idindex

4

1 に答える 1

5

Meteor Collection を作成するとnew Mongo.Collection('col')、ネイティブ Node MongoDriver ではない Minimongo インスタンスが返されますよね?

したがって、一部の方法は機能しないか、完全にサポートされていません..のようにcollection.aggregate

ただし、ネイティブ ドライバーを介して簡単にアクセスCol.rawCollection()し、ネイティブ インスタンスで直接クエリを実行できます。もちろん、ネイティブ インスタンスはサーバー上でのみアクセスできます

たとえば、最初に配列を取得し、必要に応じて並べ替えることができます。

$set: {my_array: sortedArray }$pull個人的には、更新操作を 2 つ ( & $push at $position) ではなく 1 つだけ実行する必要があるため、この方法をお勧めします。

しかし、それをしたい場合は $push at $position の方法で..ネイティブドライバーでそれを行うだけです

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

注: Meteor 同期スタイルのため、Meteor.wrapAsync が必要です。それなしで実行することもできます。Collection.rawCollection().update(...)

于 2015-12-22T19:37:11.227 に答える