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

Java 在单个查询中按ObjectId顺序加载多个对象的最佳方法?,java,mongodb,morphia,Java,Mongodb,Morphia,我有一些要从MongoDB加载的对象的ObjectID列表。目前,我使用Java驱动程序对每一个进行循环并执行get,但这是非常低效的 我尝试了MorphiaDatastore.get(java.lang.Class tClass,java.lang.Iterable vs)方法,并向它传递了一个ID列表。不幸的是,顺序没有被保留,我猜是因为它使用了$in:{…}语法 有没有一种方法可以执行单个查询并以任意顺序获取对象 更新:要明确的是,我有一个有序的ID列表,并希望以相同的顺序加载相应的对象。

我有一些要从MongoDB加载的对象的ObjectID列表。目前,我使用Java驱动程序对每一个进行循环并执行get,但这是非常低效的

我尝试了Morphia
Datastore.get(java.lang.Class tClass,java.lang.Iterable vs)
方法,并向它传递了一个ID列表。不幸的是,顺序没有被保留,我猜是因为它使用了
$in:{…}
语法

有没有一种方法可以执行单个查询并以任意顺序获取对象


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

您可以在从数据库获取它们后对它们重新排序

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

我最近使用Mongo所做的是创建一个
findByIds(Iterable ids)
,它将完成Morphia似乎所做的大部分工作,只是它将返回结果作为
Map
(或
Map

有不同的可能策略来处理找不到的ID:

  • 不要把钥匙放在地图上(我选择)
  • 将该键设置为空值
  • 提出例外
我对Iterable进行了迭代,以确保它保留了迭代顺序(使用
LinkedHashMap


你也可以做类似的事情。您拥有按迭代顺序对MongoDB结果进行排序所需的一切。所有的东西都已经在内存中了,不会花那么多钱。

也许我不理解你的问题。您没有直接使用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);

不幸的是,我希望对象的顺序与我的ID相同,这不仅仅是按ID降序:(AFAIK任何数据库都不能保证在不使用order by/sort的情况下对查询结果进行排序。我认为您最好的选择是对in列表进行升序或降序排序,并对db使用相同的子句。感谢Sebastien和David!这是一个足够简洁的解决方案。我只是希望我错过了一些按ID顺序进行查询的简洁内置方法。