在单个查询中按顺序加载ObjectId的多个对象的最佳方法?

时间:2013-07-19 21:30:20

标签: java mongodb morphia

我有一个ObjectID的列表,用于我想从MongoDB加载的一些对象。目前我遍历每个并使用Java驱动程序进行获取,但这是非常低效的。

我尝试了Morphia Datastore.get(java.lang.Class<T> tClass, java.lang.Iterable<V> vs)方法并向其传递了ID列表。不幸的是,订单没有保留,我猜是因为它使用的是$in: {...}语法。

有没有办法进行单个查询并以任意顺序获取对象?

更新:要清楚,我有一个有序的ID列表,并希望以相同的顺序加载相应的对象。

3 个答案:

答案 0 :(得分:2)

据我所知,没有这样的选择,我们甚至不需要这样的选择。

我最近使用Mongo做的是创建一个findByIds(Iterable<ObjectId> ids),它主要完成Morphia似乎做的事情,但它会将结果作为Map<ObjectId,Model>(或Map<String,Model>返回)

有不同的策略可以处理无法找到的ID:

  • 不要将密钥放在地图中(我选择)
  • 将密钥置为空值
  • 提出例外

我迭代了Iterable,以便我确定它保留了迭代顺序(使用LinkedHashMap

你可以做类似的事情。您拥有在迭代顺序中对MongoDB结果进行排序所需的一切。一切都已经在记忆中,它的成本并不高......

答案 1 :(得分:1)

从数据库中获取后,您可以对它们进行重新排序。

答案 2 :(得分:0)

也许我在这里不理解你的问题。您是否有理由直接使用sort选项从驱动程序中执行$ in查询?以下代码不适合您吗?

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);