【问题标题】:Querying and updating in mongodb using morphia datastore使用morphia数据存储在mongodb中查询和更新
【发布时间】:2013-07-03 10:44:45
【问题描述】:

我的课程如下:

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

    @Embedded
    Map<EnumChannelType, MoDBChannel> data = new HashMap<EnumChannelType, MoDBChannel>();
}

其中,MoDBChannel 类是:

@Entity("Collection_IAGlobals")
@Embedded
public class MoDBChannel extends MoDBTopic {
    @Indexed
    private String channelId;

    @Embedded
    private Map<String, MoDBTopic> data = new HashMap<String, MoDBTopic>();
}

MoDBTopic 类是:

@Entity("Collection_IAGlobals")
@Embedded
public class MoDBTopic {
    private String topic;
    private Double score1 = 0.0;
    private Double 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);
    }
}

我有一个 MoDBIAGlobals 类的对象保存为:

dataStore.save(globals)

其中全局的 JSON 如下:

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

打印结果为:

results: { "data.channelId" : "FB1234" , "data.data.topic" : "NO_TOPIC"}
results.count: 0

我做错了什么吗?

【问题讨论】:

  • 你在 mongo shell 上试​​过这个查询吗?下面的查询怎么样,它有效吗? { "data.channelId" : "FB1234" , "data.data.topic.NO_TOPIC" : "NO_TOPIC"}
  • 我是 mongodb 的新手,直接通过 java 工作。对 mongo shell 没有任何经验..
  • 我刚刚检查过,它也没有在 shell 中给出任何结果。所以我猜查询参数中有些错误。但是错误是什么??

标签: java mongodb mongodb-query morphia


【解决方案1】:

如果您想通过idchannelId 查找MoDBIAGlobals,我不明白您为什么要查询data.channelIddata.data.topic。而且您的数据建模也很混乱。无论如何,您的查询似乎与您的文档结构不匹配。 data.data.topicdata.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());

现在,如果你想通过idchannelId 查询,试试这个:

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

【讨论】:

  • 非常感谢.. 实际上我正在尝试像 "data.channelId" / "data(FACEBOOK).channelId" / FACEBOOK.channelId .. 等等。现在我知道需要使用 map-key 以及 @987654336 @ 而不是 parenthesis.. 谢谢。
  • 也让我知道如何在地图上查询,例如我想检查data 是否包含密钥FACEBOOK,例如query.field("data").containKey(EnumChannelType.FACEBOOK.name());query.field("data").containKey(EnumChannelType.FACEBOOK);??
  • 我想通了.. 可以通过.. query.field("data."+EnumChannelType.FACEBOOK.name()).exists();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2016-11-11
相关资源
最近更新 更多