Может ли метеорский монго-драйвер обрабатывать $каждый и $операторы позиции?
Я работаю над метеорным приложением с обновлением метеоритов. Я хочу переместить элемент в массив документов 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
Ответы
Ответ 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(). Обновление (...)