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());