2012-07-25 45 views
3

我有一個稱爲MongoRuleJUnit rule看起來像

public class MongoRule extends ExternalResource { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MongoRule.class); 
    private final MongoService mongoService; 

    public MongoRule() throws UnknownHostException { 
     mongoService = new MongoService(getConfiguredHost(), getConfiguredPort(), getConfiguredDatabase()); 
    } 

    @Override 
    protected void before() throws Throwable { 
     LOGGER.info(" Setting up Mongo Database - " + getConfiguredDatabase()); 
    } 

    @Override 
    protected void after() { 
     LOGGER.info("Shutting down the Mongo Database - " + getConfiguredDatabase()); 
     mongoService.getMongo().dropDatabase(getConfiguredDatabase()); 
    } 

    @Nonnull 
    public DB getDatabase() { 
     return mongoService.getMongo().getDB(getConfiguredDatabase()); 
    } 

    @Nonnull 
    public Mongo getMongo() { 
     return mongoService.getMongo(); 
    } 

    @Nonnull 
    public MongoService getMongoService() { 
     return mongoService; 
    } 

    public static int getConfiguredPort() { 
     return Integer.parseInt(System.getProperty("com.db.port", "27017")); 
    } 

    @Nonnull 
    public static String getConfiguredDatabase() { 
     return System.getProperty("com.db.database", "database"); 
    } 

    @Nonnull 
    public static String getConfiguredHost() { 
     return System.getProperty("com.db.host", "127.0.0.1"); 
    } 
} 

然後我嘗試插入一些文檔如下

public static void saveInDatabase() { 
     LOGGER.info("preparing database - saving some documents"); 
     mongoRule.getMongoService().putDocument(document1); 
     mongoRule.getMongoService().putDocument(document2); 
    } 

在哪裏document1document2是有效的DBObject文件。該模式看起來像

{ 
    Id: 001 
    date_created: 2012-10-31 
    vars: { 
     '1': { 
      name: n1 
      value:v1 
     } 
     '2': { 
      name: n2 
      value:v2 
     } 
     '3': { 
      name: n3 
      value:v3 
     } 

} 
{ 
    Id: 002 
    date_created: 2012-10-30 
    vars: { 
     '1': { 
      name: n4 
      value:v4 
     } 
     '2': { 
      name: n5 
      value:v5 
     } 
     '3': { 
      name: n6 
      value:v6 
     } 

} 

現在我嘗試查詢收集和獲取這些對象,所以我這樣做

public static void getDocuments(List<String> documentIds) { 
     BasicDBList docIds = new BasicDBList(); 
     for (String docId: documentIds) { 
      docIds.add(new BasicDBObject().put("Id", docId)); 
     } 
     DBObject query = new BasicDBObject(); 
     query.put("$in", docIds); 
     DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); 
     System.out.println(dbCursor == null); 
     if (dbCursor != null) { 
      while (dbCursor.hasNext()) { 
       System.out.println("object - " + dbCursor.next()); 
      } 
     } 
    } 

mycollection是所有文件都堅持收集,這是來自外部服務。
當我運行這個文件我看到下面

preparing database - saving some documents 
inserting document - DBProposal # document1 
inserting document - DBProposal # document2 
false 

這意味着collection.find()無法找到這些文件。

這是什麼我不在這裏做?我怎樣才能取回文件?

我很新的使用JavaMongo和使用該reference構造查詢

UPDATE
更改查詢方式後構造,我還沒有看到文件

public static void getDocuments(List<String> documentIds) { 
      BasicDBList docIds = new BasicDBList(); 
      docIds.addAll(documentIds) 
      DBObject query = new BasicDBObject(); 
      query.put("$in", docIds); 
      DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); 
      System.out.println(dbCursor == null); 
      if (dbCursor != null) { 
       while (dbCursor.hasNext()) { 
        System.out.println("object - " + dbCursor.next()); 
       } 
      } 
     } 

和集合名稱通過

返回
private static String getCollectionName(@Nonnull final DBObject dbObject) { 
     return "mycollection"; 
    } 
+0

你可以發佈你的'putDocument'代碼,以及 - 只是確保了集合名稱是相同的:) – Ross 2012-07-25 15:18:22

+0

此外,請確保您至少使用SAFE的寫入問題,否則在執行查找之前寫入操作可能未提交到內存,這意味着它不會找到任何文檔。 – christkv 2012-07-25 15:35:30

+0

這不是一個有效的查詢。我會發布回覆。 – 2012-07-25 15:38:14

回答

8

你現在正在做的相當於:

db.col.find({$in:[{Id:id1}, {Id:id2}, ..., {Id:idN}]}) 

這不是有效的查詢,是因爲你沒有指定哪一個領域到$英寸我假設你想要:

db.col.find({Id:{$in:[id1, id2, ..., idN]}}) 

相應地更改您的查詢構建代碼,你應該沒問題。

編輯:添加正確的代碼:

public static void getDocuments(List<Integer> documentIds) { 

      BasicDBList docIds = new BasicDBList(); 
      docIds.addAll(documentIds) 
      DBObject inClause = new BasicDBObject("$in", docIds); 
      DBObject query = new BasicDBObject("Id", inClause); 
      DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); 
      System.out.println(dbCursor == null); 
      if (dbCursor != null) { 
       while (dbCursor.hasNext()) { 
        System.out.println("object - " + dbCursor.next()); 
       } 
      } 
     } 

請注意,這是假定「ID」是其他東西比「_id」

+1

我在代碼中添加了更新,仍然無法運行 – daydreamer 2012-07-25 15:55:10

+0

代碼仍然是錯誤的。並添加一個示例文檔,您的模式描述是不明確的。 – 2012-07-26 09:34:08

+0

我更新了架構,感謝您的幫助,我仍然無法弄清楚如何正確執行此操作 – daydreamer 2012-07-26 13:49:53