【问题标题】:retrieving data with mongodb java driver 3.4 using find()-method with projection使用带有投影的 find() 方法使用 mongodb java driver 3.4 检索数据
【发布时间】:2017-12-07 05:59:03
【问题描述】:

我正在使用 mongodb java 驱动程序 3.4。

在mongodb数据库中文件按照如下结构保存:

{
    "_id" : ObjectId("595a9fc4fe3f36402b7edf0e"),
    "id" : "123",
    "priceInfo" : [
        {object1: value1}, {object2: value2}, {object3: value3}
    ]
}

为了检索具有特定 id 的 Document 的“priceInfo”-Array,我编写了以下代码:

collection.find(eq("id", id)).first().projection(fields(include("priceInfo"), excludeId()));

我也根据文档编写了这段代码,你可以在这里找到:

http://mongodb.github.io/mongo-java-driver/3.4/javadoc/?com/mongodb/client/model/Projections.html

问题是我的 IDE 不接受此代码。

它给了我以下错误指示:

我不知道为什么这段代码不起作用。起初,IDE 建议包括几个类——我这样做了。但在那之后我仍然得到一个错误指示,即你在上面看到的那个。

代码有什么问题?如何检索 ID 为 id 的 Document 的 priceInfo 数组?

********************************更新************** ********************

根据要求,这是整个班级:

package DatabaseAccess;

import Models.GasStation;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Projections.excludeId;
import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;
import com.mongodb.client.model.Updates;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.logging.Level;
import org.bson.Document;


public class databaseAccess {

    private final String DB_HOST = "localhost"; 
    private final int DB_PORT = 27017;
    private final String DB_NAME = "db1"; 
    private final String DB_COLLECTION = "prices"; 
    private final MongoClient mongoClient;
    private final MongoDatabase database;
    private final MongoCollection<Document> collection; 

    public databaseAccess(){
        mongoClient = new MongoClient(DB_HOST, DB_PORT);
        database = mongoClient.getDatabase(DB_NAME);
        collection = database.getCollection(DB_COLLECTION);
    }


    public String readFromDB(String id){
        collection.find(eq("id", id)).first().projection(fields(include("priceInfo"), excludeId()));
        return null;     
    }

}

【问题讨论】:

  • 能否请您展示您的课程的完整代码(带导入)。
  • 这不是重复的......在我的情况下这是一个数组并不重要。我想把数组作为一个整体。我使用了与提供批准答案的代码相同的代码(除了留下“地图......”部分,因为我已经提到对从数组中检索单个项目不感兴趣)......问题是:为什么此代码给我一个错误指示?
  • 请考虑在使用方法时阅读 javadocs。这对我有帮助,并且肯定会帮助您以正确的方式使用 API。这是编译时错误,它告诉您没有正确使用 API。顺便说一句,答案确实包含 first with projections 的正确用法。
  • TBH,我按照指南 docs.mongodb.com/manual/tutorial/… 不知何故包含关键字给了我错误,只是为了返回 _id 字段。

标签: java mongodb projection mongodb-java data-retrieval


【解决方案1】:

您正在对方法中的调用链进行操作。 让我们分析一下链中的每个元素:

MongoCollection:

FindIterable find() - 查找集合中的所有文档。

返回类型是FindIterable&lt;TDocument&gt;,你在它上面调用链中的下一个方法:

FindIterable

从接口 com.mongodb.async.client.MongoIterable 继承的方法:

batchCursor, first, forEach, into, map

好的,我们去MongoIterable

MongoIterable

void first(SingleResultCallback callback) - 帮助器返回迭代器中的第一项或 null。

这意味着first(...) 不返回任何内容。你是从无到有调用projection(...),这当然不适用,所以编译器将其标记为错误。

要调用projection(Bson projection),你应该有FindIterable&lt;T&gt; 实例。 MongoCollection.find()可以为你提供这个实例:

collection.find(eq("id", id)).projection(fields(include("priceInfo"), excludeId()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多