Запросы по сравнению с ObjectId - PullRequest
0 голосов
/ 05 октября 2011

У меня есть val maxId = new ObjectId(...), и я хочу запросить что-то вроде этого: collection.find("_id" $lte maxId). Это ошибка компиляции, поскольку ObjectId не включает соответствующую черту ValidDateOrNumericType. Как правильно запрашивать объекты, сравнивая их идентификаторы?

В оболочке Mongo это возможно:

> db.test.find({"_id": {$lte: ObjectId("4e825d2f84ae30e970bc0f95")}})
{ "_id" : ObjectId("4e82540684ae236af6e72177")}
{ "_id" : ObjectId("4e825baa84aea840b82e0278")}
...
>

Также с драйвером Java это работает:

query.put("_id", new BasicDBObject("$lte", new ObjectId("4e825d2f84ae30e970bc0f95")))

Это выполнимо с Касба ?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

С Casbah это сделать невозможно, поскольку ObjectId не преобразуется в ValidDateOrNumericType.В итоге я использовал Java API:

collection.find(new QueryBuilder().put("_id").lessThanEquals(maxId).get())
0 голосов
/ 05 октября 2011

Вы можете реализовать оператор сравнения как метод.Чтобы использовать его, ваш ObjectId должен быть слева от сравнения.

Вы можете использовать «pimp my library», чтобы обеспечить неявное преобразование во что-то, что содержит сравнение.(см. этот вопрос Как работает '1 * BigInt (1)' и как я могу сделать то же самое? )

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

...