Полностью согласен, но это только один из компромиссов использования MongoDB. Будет намного лучше в следующем выпуске (2.2), который будет содержать новую структуру агрегирования. Структура агрегации позволит вам вычислять вещи на лету. Не будет выполнять, а также предварительно рассчитать и сохранить значения, но это избавит вас от проблем с синхронизацией. Еще один компромисс, чтобы рассмотреть. Вы можете проверить эти функции в ветке 2.1.

оложим, у меня есть:

Order: {_id: ..., items: [...]}

Как отфильтровать заказы с номером товара больше 5?

Ответы на вопрос(1)

Решение Вопроса

Вы можете использовать оператор $ where.

> db.orders.save({Order: {items: [1,2]}})                                                    
> db.orders.save({Order: {items: [1,2,3]}})
> db.orders.find({$where:function() { if (this["Order"]["items"].length > 2) return true; }})
{ "_id" : ObjectId("4d334c9102bcfe450ce52585"), "Order" : { "items" : [ 1, 2, 3 ] } }

Два недостатка $ where заключаются в том, что он не может использовать индекс, и объект BSON необходимо преобразовать в объект JavaScript, поскольку вы запускаете пользовательскую функцию JavaScript для каждого документа в коллекции.

Итак, $ where может быть очень медленным для больших коллекций. Но для специальных или редко запускаемых запросов это очень удобно. Если вам часто нужно запускать подобные запросы, следуйте рекомендациям Bugai13, так как вы можете затем индексировать ключ, в котором вы храните размер массива.

 wrdevos20 апр. 2012 г., 17:14
Это также может быть написано немного короче:.find({$where: "this.Order.items.length > 2"})

Ваш ответ на вопрос