如何在 Java mongodb 驱动程序中使用“_id”字段查询文档?

问题描述 投票:0回答:8

我试图通过搜索“_id”键在 MongoDB 中查找文档。我的文件看起来像这样-

{
  "_id" : ObjectId("4f693d40e4b04cde19f17205"),
  "hostname" : "hostnameGoesHere",
  "OSType" : "OSTypeGoesHere"
}

我正在尝试搜索此文档,因为-

ObjectId id= new ObjectId("4f693d40e4b04cde19f17205");        
BasicDBObject obj = new BasicDBObject();        
obj.append("_id", id);        
BasicDBObject query = new BasicDBObject();        
query.putAll(query);

但是我得到以下错误-

error: reference to putAll is ambiguous, both method putAll(Map) in BasicBSONObject and method putAll(BSONObject) in BasicBSONObject match
        query.putAll(query);

BasicDBObject 的append 方法支持(String Key, Value),如果我将“_id”作为String 传递给此方法,则不会匹配任何文档。

所以我的问题是如何传递“_id”?

java mongodb mongodb-java
8个回答
70
投票

不确定其他人是否正在搜索有关此主题的答案,但这是基于“_id”搜索 MongoDB 记录的最简单方法。 MongoDB 文档未更新,仍将 ObjectId 显示为

com.mongodb
包的一部分(它通常也不会提供有关通过 ObjectId 进行搜索的大量信息)。

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

32
投票

对于那些正在寻求更新方法的人,尤其是 3.4:

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.ObjectId;

import static com.mongodb.client.model.Filters.eq;

//......
MongoCollection<Document> myCollection = database.getCollection("myCollection");
Document document = myCollection.find(eq("_id", new ObjectId("4f693d40e4b04cde19f17205"))).first();
if (document == null) {
    //Document does not exist
} else {
    //We found the document
}

6
投票

你可以这样做

 ObjectId id= new ObjectId("4f693d40e4b04cde19f17205");        
    BasicDBObject obj = new BasicDBObject();        
    obj.append("_id", id);        
    BasicDBObject query = new BasicDBObject();        
    query.putAll((BSONObject)query);

1
投票

通过使用查询解决它 -

query.putAll((BSONObject)query);

0
投票

更简单的方法是:

Bson filter = Filters.eq("_id", new ObjectId("4f693d40e4b04cde19f17205"));
mongoConfig.getMongoTemplate().getCollection("myCollection").find(filter);

参考: https://www.baeldung.com/mongodb-query-documents-id


0
投票

我找到了一种解决方法,使用更多的代码,需要一个表示要找到的 id 的字符串作为参数传递。

import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import org.bson.conversions.Bson;
import org.bson.Document;
import org.bson.types.ObjectId;   

[...]

public static void findCustomerById(String id) {
    try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
        MongoDatabase database = mongoClient.getDatabase("database_name");
        Bson filter = Filters.eq("_id", new ObjectId(id));
        MongoCollection<Document> collection = database.getCollection("customer");

        //Tries to find the document
        Document doc = collection. Find(filter).first();
        //prints the document
        System.out.println(doc.toJson());
    } catch (Exception e) {
        System.out.println("Error finding document");
        System.out.println("Error in: " + e.getMessage());
        e.printStackTrace();
    }

0
投票

如果您的类和 collectionName 不匹配,请不要忘记添加 collectionName 参数。我提出这个问题是因为我的 _id 查询没有用,尽管乍一看它看起来不错。


-2
投票

你可以试试这个片段:

ObjectId id= new ObjectId("4f693d40e4b04cde19f17205");        
BasicDBObject obj = new BasicDBObject();        
obj.append("_id", id);        
BasicDBObject query = new BasicDBObject();        
query.putAll((BSONObject)obj);
© www.soinside.com 2019 - 2024. All rights reserved.