2013-07-19 1 views
2

У меня есть список ObjectID для некоторых объектов, которые я хочу загрузить из MongoDB. В настоящее время я прохожу через каждый из них и получаю использование драйвера Java, но это очень неэффективно.Лучший способ загрузить несколько объектов ObjectId в порядке в одном запросе?

Я пробовал метод Morphia Datastore.get(java.lang.Class<T> tClass, java.lang.Iterable<V> vs) и передал ему список идентификаторов. К сожалению, порядок не сохраняется, я думаю, потому что он использует синтаксис $in: {...}.

Есть ли способ сделать один запрос и получить объекты в произвольном порядке?

Обновление: чтобы быть ясным, у меня есть упорядоченный список идентификаторов и вы хотите загрузить соответствующие объекты в том же порядке.

ответ

2

Насколько я знаю, такого варианта нет, и нам даже не нужен такой вариант.

Что я сделал в последнее время с помощью Монго, чтобы создать findByIds(Iterable<ObjectId> ids), который будет делать то, что в основном, кажется, делает Морфий, за исключением того, что возвращает результат в виде Map<ObjectId,Model> (или Map<String,Model>)

Существовали различные возможные стратегии для справиться с идентификаторами, которые не могут быть найдены:

  • не вставила ключ в карте (которую я выбрать)
  • Поместите ключ с нулевым значением
  • Raise с исключением ион

И я итерация над Iterable, так что я уверен, что он сохраняет порядок итераций (с использованием LinkedHashMap)

Вы могли бы сделать что-то подобное. У вас есть все необходимое для сортировки результата MongoDB в вашем итерационном порядке. Все уже в памяти, это не так дорого ...

+0

Спасибо, Себастьян и Дэвид! Это довольно аккуратное решение. Я просто надеялся, что пропустил какой-то аккуратный встроенный способ запроса по идентификаторам по порядку. –

1

Вы можете изменить порядок их после получения их из базы данных.

0

Возможно, я не понимаю ваш вопрос здесь. Есть ли причина, по которой вы не делаете запрос $ от драйвера напрямую с параметром сортировки? Не работает ли для вас следующий код?

ArrayList ids = new ArrayList(); 
ids.add(new ObjectId("51e9cc5496674e6b7bcea11f")); 
ids.add(new ObjectId("51e9cc5296674e6b7bcea11e")); 
BasicDBObject query = new BasicDBObject("_id", new BasicDBObject("$in", ids)); 
BasicDBObject sort = new BasicDBObject("_id", -1); 
DBCursor cursor = coll.find(query).sort(sort); 
+0

К сожалению, я хочу, чтобы объекты в том же порядке, в которых находятся мои идентификаторы, которые не просто спускаются по ID :( –

+0

AFAIK no database гарантирует заказ результатов из запроса без использования заказа/сортировки. опция состоит в том, чтобы сортировать список по возрастанию или убыванию и использовать одно и то же предложение для db. –