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

49

我正在尝试通过在"_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"作为字符串传递给该方法,它将无法匹配任何文档。

那么我的问题是如何传递"_id"?

8个回答

71

不确定是否有其他人在搜索关于这个话题的答案,但是下面是根据 "_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;
}

它已经过时了吗? - Stu_Dent

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
}

我们可以在这里使用findOne吗? - neoexpert
我认为我们不再能使用那种方法了。它是旧版API的一部分:http://api.mongodb.com/java/2.14/com/mongodb/DBCollection.html 。 现在有一个略微不同的新方法:http://api.mongodb.com/java/3.0/com/mongodb/async/client/MongoCollection.html。 - bogolyandras
1
eq 不适用于 3.12? - Stu_Dent

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

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参数。 我看到这个问题,因为我的_id查询一开始看起来很好,但实际上却无法正常工作。


-2
你可以尝试这段代码片段:
ObjectId id= new ObjectId("4f693d40e4b04cde19f17205");        
BasicDBObject obj = new BasicDBObject();        
obj.append("_id", id);        
BasicDBObject query = new BasicDBObject();        
query.putAll((BSONObject)obj);

这与Nifras Nipy的答案有何不同? - ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接