Подтвердить что ты не робот

Может ли метеорский монго-драйвер обрабатывать $каждый и $операторы позиции?

Я работаю над метеорным приложением с обновлением метеоритов. Я хочу переместить элемент в массив документов mongo. Для этого я $pull из массива, а затем $push в определенной позиции index согласно документации mongoDB.

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

Meteor/Mongo выдает следующую ошибку:

не удалось выполнить обновление: MongoError: Can canicalize query: BadValue unknown оператор верхнего уровня: $each

Сначала я реализовал эту клиентскую сторону. Я предположил, что это не сработало из-за ограничений minimongo.

Я написал метод обработки этой серверной части, но в итоге получаю ту же ошибку.

Что не так с этим запросом, может ли метеор обрабатывать $каждый оператор?


EDIT: я попытался вставить его прямо в robomongo, и он сработал. Версия Mongo при вводе db.version() возвращает 2.6.7


* EDIT2: я не ожидал этого, поэтому я не проверял раньше: обновление работает, как с $pull, так и с $push. Однако, даже если данные действительно обновляются, я все равно получаю сообщение об ошибке.


* EDIT: Вот некоторые примеры данных:

{
    "_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.id в позиции index

4b9b3361

Ответ 1

Если вы создаете коллекцию Meteor с new Mongo.Collection('col'), вы получите экземпляр Minimongo, который не является родным Node MongoDriver, правильно?

Поэтому некоторые методы просто не работают или не полностью поддерживаются.. например collection.aggregate

Но вы можете легко получить доступ к собственному драйверу через Col.rawCollection() и выполнить свой запрос непосредственно в собственном экземпляре. Нативный экземпляр доступен только на сервере, конечно.

Итак, чтобы делать то, что вы хотите, у вас есть несколько способов, например, вы можете сначала взять массив, прибегнуть к нему, как хотите, и

$set: {my_array: sortedArray } Лично я предпочел бы это, потому что вам нужно выполнить только одну операцию обновления вместо двух ($pull и $push at $position)

Но если вы хотите сделать это $push на $position way.. просто сделайте это с помощью родного драйвера

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

Примечание: вам нужен Meteor.wrapAsync из-за стиля синхронизации Meteor, вы также можете сделать это без него. Collection.rawCollection(). Обновление (...)