Java 使用morphia数据库在mongodb中进行查询和更新

Java 使用morphia数据库在mongodb中进行查询和更新,java,mongodb,mongodb-query,morphia,Java,Mongodb,Mongodb Query,Morphia,我的课程如下: @Entity("Collection_IAGlobals") public class MoDBIAGlobals { @Id @Indexed String id; @Embedded Map<EnumChannelType, MoDBChannel> data = new HashMap<EnumChannelType, MoDBChannel>(); } {"id":"usr1234", "data":{

我的课程如下:

@Entity("Collection_IAGlobals")
public class MoDBIAGlobals {
    @Id
    @Indexed
    String id;

    @Embedded
    Map<EnumChannelType, MoDBChannel> data = new HashMap<EnumChannelType, MoDBChannel>();
}
{"id":"usr1234",
"data":{"FACEBOOK":{"channelId":"FB1234",
                    "data":{"NO_TOPIC":{"topic":"NO_TOPIC",
                                        "score1":1.0,
                                        "score2":0.0}},
                    "score1":0.0,
                    "score2":0.0}}}
和MoDBIA_DAO类:

public class MoDBIA_DAO extends BasicDAO<MoDBIAGlobals, String> {
    public MoDBIA_DAO(Mongo mongo, Morphia morphia, String dbName) {
        super(mongo, morphia, dbName);
    }
}
其中,globals的JSON如下所示:

@Entity("Collection_IAGlobals")
public class MoDBIAGlobals {
    @Id
    @Indexed
    String id;

    @Embedded
    Map<EnumChannelType, MoDBChannel> data = new HashMap<EnumChannelType, MoDBChannel>();
}
{"id":"usr1234",
"data":{"FACEBOOK":{"channelId":"FB1234",
                    "data":{"NO_TOPIC":{"topic":"NO_TOPIC",
                                        "score1":1.0,
                                        "score2":0.0}},
                    "score1":0.0,
                    "score2":0.0}}}
全局“>

现在我想查询,以便获得类
MoDBIAGlobals
的对象,其中
的“id”==“usr1234”
的“channelId”==“FB1234”
。如何创建此查询

我尝试了以下方法,但没有得到任何结果:

MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name);
Datastore dataStore = morphia.createDatastore(mongo, DB_Name);
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation();

query.field("data.channelId").equal("FB1234");
query.field("data.data.topic").equal("NO_TOPIC");
QueryResults<MoDBIAGlobals> results = dao.find(query);
System.out.println("results: " + results);
System.out.println("results.count: " + results.countAll());

我做错了什么吗?

我不明白你为什么要查询
数据.channelId
数据.data.topic
如果你想通过
id
channelId
查找
MoDBIAGlobals
。你的数据建模也很混乱。无论如何,你的查询似乎与你的文档结构不匹配cture.字段
data.data.topic
data.channelId
不存在。请尝试用下面的代码替换:

MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name);
Datastore dataStore = morphia.createDatastore(mongo, DB_Name);
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation();

query.field("data.FACEBOOK.channelId").equal("FB1234");
query.field("data.FACEBOOK.data.topic.NO_TOPIC").equal("NO_TOPIC");
QueryResults<MoDBIAGlobals> results = dao.find(query);
System.out.println("results: " + results);
System.out.println("results.count: " + results.countAll());

您在mongo shell上尝试过这个查询吗?下面的查询如何,它可以工作?
{“data.channelId”:“FB1234”,“data.data.topic.NO_topic”:“NO_topic”}
我对mongodb完全陌生,直接通过java工作。我对MongoShell没有任何经验..我只是检查了一下,它在shell中也没有给出任何结果..所以我猜在查询参数中有一些错误..但是错误是什么呢?非常感谢..实际上我是在尝试像
“data.channelId”
/
“data(FACEBOOK)那样的数据.channelId“
/
FACEBOOK.channelId
等。现在我得到了需要使用
map键的
dot
,而不是
括号的
。谢谢。还请告诉我如何在map上查询,例如,我想检查
数据
是否包含一个键
FACEBOOK
,类似
query.field(“data“).containKey(EnumChannelType.FACEBOOK.name());
query.field(“data”).containKey(EnumChannelType.FACEBOOK);
?我算出了。可以通过..
query.field(“数据”+EnumChannelType.FACEBOOK.name()).exists();
results: { "data.channelId" : "FB1234" , "data.data.topic" : "NO_TOPIC"}
results.count: 0
MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name);
Datastore dataStore = morphia.createDatastore(mongo, DB_Name);
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation();

query.field("data.FACEBOOK.channelId").equal("FB1234");
query.field("data.FACEBOOK.data.topic.NO_TOPIC").equal("NO_TOPIC");
QueryResults<MoDBIAGlobals> results = dao.find(query);
System.out.println("results: " + results);
System.out.println("results.count: " + results.countAll());
MoDBIA_DAO dao = new MoDBIA_DAO(mongo, morphia, DB_Name);
Datastore dataStore = morphia.createDatastore(mongo, DB_Name);
Query<MoDBIAGlobals> query = dataStore.createQuery(MoDBIAGlobals.class).disableValidation();

query.field("data.FACEBOOK.channelId").equal("FB1234");
query.field("id").equal("user1234");

QueryResults<MoDBIAGlobals> results = dao.find(query);
System.out.println("results: " + results);
System.out.println("results.count: " + results.countAll());