2013-07-03 19 views
1

我有類如下MongoDB中更新:查詢和使用嗎啡數據存儲

@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}}} 

JSON of object <code>globals</code>

現在我想查詢以獲得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 

難道我做錯了什麼?

+0

您是否嘗試過在蒙戈外殼此查詢?下面的查詢呢,它有效嗎? '{「data.channelId」:「FB1234」,「data.data.topic.NO_TOPIC」:「NO_TOPIC」}' –

+0

我對mongodb完全陌生,並且直接通過java工作。對mongo shell沒有任何經驗。 –

+0

我剛剛檢查過,它在shell中也沒有給出任何結果。所以我猜在查詢參數中有一些錯誤。但是錯誤是什麼? –

回答

3

,如果你想通過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()); 
+0

非常感謝..其實我試圖像''data.channelId「''''數據(FACEBOOK).channelId」''''FACEBOOK.channelId' ..等現在我得到了'map-key'需要也可以用'dot'代替'括號'..謝謝。 –

+0

也讓我知道如何在地圖上查詢我想檢查'data'是否包含鍵'FACEBOOK',類似'query.field(「data」)。containKey(EnumChannelType.FACEBOOK.name());'或'query.field(「data」)。 containKey(EnumChannelType.FACEBOOK);'?? –

+0

我想通了..它可以通過..'query.field(「data。」+ EnumChannelType.FACEBOOK.name())。exists();' –