2

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

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

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

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

4

3 回答 3

1

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

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

有不同的可能策略来处理无法找到的 id:

  • 不要把钥匙放在地图上(我选择的)
  • 将键设置为空值
  • 引发异常

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

你可以做类似的事情。您拥有按照迭代顺序对 MongoDB 结果进行排序所需的一切。一切都已经在记忆中,它不会花费那么多......

于 2013-07-19T23:03:41.487 回答
1

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

于 2013-07-19T22:01:29.417 回答
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);
于 2013-07-19T23:52:22.573 回答