Используя scala и lift, как я могу выполнять эффективные операции фильтрации документов в коллекции mongodb? - PullRequest
2 голосов
/ 23 июня 2011

У меня есть коллекция пользователей в mongodb, и я использую lift / scala для выполнения операций User.findAll и получения количества пользователей, созданных за определенные периоды времени. Я использую метод getTime для objectId, однако мне нужно применить несколько методов и умножить их, чтобы получить строку, хранящуюся в каждом документе, преобразовать ее обратно в objectID и преобразовать в секунды из миллисекунд. Это строка кода для пользователей, созданная за последний час: val users = User.findAll.filter {u: User => ((((ObjectId.massageToObjectId (u._id)). getTime) / 1000) <= 3600)}. длина </p>

Мне нужно найти способ сделать это внутри базы данных, а не помещать все данные в память и затем фильтровать их с помощью функции. В прошлом я использовал queryBuilder такими способами для достижения той же цели, но в этом случае у меня не было других методов вычислений, которые можно применить к значению из документа: val qry1 = QueryBuilder.start ("numberOfFriends"). moreThan (0) .get var oneplus: List [User] = User.findAll {qry1}

Мне также известны такие методы: User.findAll (("name" -> "joe") ~ ("age" -> 27))

И я знаю, что findall может принимать множество других вещей, таких как DBObject, называемый sort. Но я не знаю, как это использовать.

Если кто-то знает, как манипулировать одним из этих методов, или может предложить другой, то он был бы очень признателен.

Спасибо, -Ronnie

1 Ответ

2 голосов
/ 25 мая 2012

Предлагаю вам взглянуть на Rogue Foursquare.Это очень хороший способ запроса MongoDB, и он безопасен для типов!

Вот как будет выглядеть ваш запрос:

// usage
val d1 = new DateTime(2010, 5, 1, 0, 0, 0, 0, DateTimeZone.UTC)
val users = User where (_._id after d1) count()
...