У меня есть несколько моделей Mongoose с геопространственными индексами:
var User = new Schema({
"name" : String,
"location" : {
"id" : String,
"name" : String,
"loc" : { type : Array, index : '2d'}
}
});
Я пытаюсь обновить все элементы, находящиеся в области, например:
User.update({ "location.loc" : { "$near" : [ -122.4192, 37.7793 ], "$maxDistance" : 0.4 } }, { "foo" : "bar" },{ "multi" : true }, function(err){
console.log("done!");
});
Однако этоПохоже, чтобы обновить только первые 100 записей.Глядя на документы, кажется, что есть собственный предел для find
s для геопространственных индексов, который применяется, когда вы не устанавливаете ограничение.
(из документов : Используйте limit (), чтобы указать максимальное количество возвращаемых точек (по умолчанию применяется ограничение 100, если оно не указано) )
Это также относится к обновлениям независимо от флага multi
,который является гигантским сопротивлением.Если я применяю обновление, оно обновляет только первые 100.
Сейчас единственный способ обойти это - сделать что-то отвратительное:
Model.find({"location.loc" : { "$near" : [ -122.4192, 37.7793 ], "$maxDistance" : 0.4 } },{limit:0},function(err,results){
var ids = results.map(function(r){ return r._id; });
Model.update({"_id" : { $in : ids }},{"foo":"bar"},{multi:true},function(){
console.log("I have enjoyed crippling your server.");
});
});
Хотя я даже не совсем уверен, что это сработает (и его можно было бы слегка оптимизировать, выбрав только _id), я бы очень хотел избежать хранения в памяти массива n
идентификаторов, так какчисло может стать очень большим.
Редактировать: Вышеуказанный хак даже не работает, похоже, что find
с {limit:0}
все еще возвращает 100 результатов.Итак, в отчаянии и разочаровании я написал рекурсивный метод разбивки на страницы с помощью идентификаторов, а затем вернул их, чтобы я мог обновить их, используя описанный выше метод.Я добавил метод в качестве ответа ниже, но не принял его в надежде, что кто-то найдет лучший способ.
Насколько я могу судить, это проблема в ядре сервера Монготак что мангуст и нод-монгодб-натив не виноваты.Тем не менее, это действительно глупо, поскольку геопространственные индексы являются одной из немногих причин использования монго над некоторыми более надежными хранилищами NoSQL.
Есть ли способ достичь этого?Даже в node-mongodb-native или в оболочке mongo я не могу найти способ установить (или в этом случае удалить, установив в 0) ограничение на обновление.