当前位置: 首页 > 知识库问答 >
问题:

MongoDB:使用Java驱动程序按ObjectId查询

扶绍辉
2023-03-14

通过使用MongoDB和Java驱动程序,我有一个用户集合,我想根据他们的ObjectId进行查询(总体情况:我从ObjectId推断出对象的创建时间戳)。

问题是,用ObjectId查询似乎不起作用:我总是没有结果。为了测试的目的,我在搜索查询中硬编码了数据库中现有用户的ObjectId,只是为了确保我能得到结果:

{“_id”:ObjectId(“565ef85ee4b0a4db3c2fc96b”),…]

尽管如此,我从未得到任何结果。

以下是我尝试构建查询的方法,以及所创建查询的打印输出:

1.

BasicDBObject query = new BasicDBObject();
query.put("_id", "565ef85ee4b0a4db3c2fc96b");

查询:{"_id":"565ef85ee4b0a4db3c2fc96b"}

2.

BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));

查询:{“_id”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}

3.

BasicDBObject query = new BasicDBObject("_id", "565ef85ee4b0a4db3c2fc96b");

查询:{"_id":"565ef85ee4b0a4db3c2fc96b"}

4.

BasicDBObject query = new BasicDBObject("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));

查询:{“_id”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}

5.

DBObject query = new BasicDBObject("_id", 
        BasicDBObjectBuilder.start("$gte", new ObjectId("565ef85ee4b0a4db3c2fc96b")).get());

查询:{“_id”:{“$gte”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}

我的应用程序部署在OpenShift上,我在RockMongo GUI中手动尝试了这些查询;我得到了同样的空结果。但是,如果我手动搜索{“_id”:ObjectId(“565ef85ee4b0a4db3c2fc96b”)},我会得到正确的结果。

我的问题是:如何正确地构建查询以使其工作?

或者,如何让Java驱动程序生成ObjectId(“…”)而不是{“$oid”:“…”}?

共有2个答案

缑文栋
2023-03-14

我更喜欢@ImbaBalboa answer中的这种风格

import static com.mongodb.client.model.Filters.eq;
import org.bson.Document;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
Document myDoc = collection.find(eq("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"))).first();
苗阳
2023-03-14

下面的代码片段显示了如何通过_id查询Mongo集合。请注意{"$id":"

import org.bson.types.ObjectId;

public DBObject findDocumentById(String id) {
    BasicDBObject query = new BasicDBObject();
    query.put("_id", new ObjectId(id));
    DBObject dbObj = collection.findOne(query);
    return dbObj;
 }

 类似资料:
  • 谁能帮我用mongojack java驱动程序在mongodb子文档上为条件编写等效的查询 db.parentdocs.find({“subdoc._id”:ObjectId(“542d916a18ee9cfa2daeae15”)}) 这里subdoc是parentdoc文档中的一个子文档。我可以使用其他属性查询,但不能使用id BasicDBObject查询=新的BasicDBObject();

  • 请帮我找到一个合适的解决办法 收集被存储的用户详细信息app_users 用户预订是存储预订的集合 我正在使用的查找(左连接)查询是 我想从用户集合中选择具有相应用户详细信息的预订,但返回为空,因为mongodb正在将字符串与objectId进行比较,所以是否有方法执行此任务?

  • 我使用下面的mongo查询来获取最高温度。有人能帮助我们如何使用mongo java驱动程序,使用和在java中实现吗?

  • 我正在尝试使用MongoDBJava驱动程序作为聚合命令的一部分创建查询。目前我允许日期范围或特定日期数组作为参数。例如 日期范围查询工作正常,我解析xml并将其转换为在mongo中生成以下查询的DBObject; 对于指定日期,我只想返回在给定日期的00:00:00.000和第二天的00:00:00.000之间发生的结果。根据我对mongo查询的基本了解,我希望做一个类似于日期范围的$匹配,但是

  • 问题内容: 我们当前的连接配置如下所示: 并且已在当前版本(源代码)中弃用,并将被删除:“此方法无法替代。使用connectTimeout属性控制连接超时。” 我认为重试和连接超时是两回事。有谁知道为什么改变了它以及它有什么(内部)含义? 问题答案: 关于autoConnectRetry的含义有很多困惑。大多数人认为这意味着,如果操作由于IOException而失败,驱动程序将重试该操作,直到ma

  • 我试图在MongoDB\驱动程序\查询中使用选项: 如果$选项似乎可以: --------$options: 数组([排序]= $query没有给我好的选项: 限制和批量大小不等于20,为什么?请问怎么办? 提前感谢