我有一个ObjectID的列表,用于我想从MongoDB加载的一些对象。目前我遍历每个并使用Java驱动程序进行获取,但这是非常低效的。
我尝试了Morphia Datastore.get(java.lang.Class<T> tClass, java.lang.Iterable<V> vs)
方法并向其传递了ID列表。不幸的是,订单没有保留,我猜是因为它使用的是$in: {...}
语法。
有没有办法进行单个查询并以任意顺序获取对象?
更新:要清楚,我有一个有序的ID列表,并希望以相同的顺序加载相应的对象。
答案 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);