2013-06-13 195 views
0

我面對這個問題(獲得空應答),當我嘗試使用春天數據的MongoDB查詢文檔

我需要根據所投放的時間標記範圍並釋放遞減和狀態在Java中查詢。

// My document as follows: 
<ordersAuditRequest> 
    <ordersAudit> 
     <createTS>2013-04-19 12:19:17.165</createTS> 
     <orderSnapshot> 
      <orderId>43060151</orderId> 
      <placedTS>2013-04-19 12:19:17.165</placedTS> 
      <releases> 
       <ffmCenterDesc>TW</ffmCenterDesc> 
       <relStatus>d </relStatus> 
      </releases> 
    </ordersAudit> 
</ordersAuditRequest> 

我正在使用以下查詢,但它返回null。

Query query = new Query(); 
query.addCriteria(Criteria.where("orderSnapshot.releases.ffmCenterDesc").is(ffmCenterDesc) 
           .and("orderSnapshot.releases.relStatus").is(relStatus) 
           .andOperator(
             Criteria.where("orderSnapshot.placedTS").gt(orderPlacedStart), 
             Criteria.where("orderSnapshot.placedTS").lt(orderPlacedEnd) 
           ) 
       ); 
+1

什麼是null?查詢變量,還是運行它的結果?如果是運行它的結果,請顯示要查找的電話,例如final list orders = mongoTemplate.find(query,Order.class); 運行查詢不應該返回null,如果沒有找到結果,您將得到一個空列表。 – Trisha

回答

1

我無法重現你的問題,這表明問題是與數據庫中的價值觀和你傳遞到查詢中的值(即他們不匹配)。當您嘗試匹配日期時,這並不罕見,因爲您需要確保它們作爲ISODates存儲在數據庫中,並在查詢中使用java.util.date進行查詢。

我有一個測試,顯示您的查詢工作,但我已經做了一些關於您的數據的假設。

我的測試看起來像這樣,希望這會幫助你指出正確的方向,或者如果你給我更多的反饋,我可以更準確地重新創建你的問題。

@Test 
public void shouldBeAbleToQuerySpringDataWithDates() throws Exception { 
    // Setup - insert test data into the DB 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd' 'hh:mm:ss.SSS"); 
    MongoTemplate mongoTemplate = new MongoTemplate(new Mongo(), "TheDatabase"); 
    // cleanup old test data 
    mongoTemplate.getCollection("ordersAudit").drop(); 

    Release release = new Release("TW", "d"); 
    OrderSnapshot orderSnapshot = new OrderSnapshot(43060151, dateFormat.parse("2013-04-19 12:19:17.165"), release); 
    OrdersAudit ordersAudit = new OrdersAudit(dateFormat.parse("2013-04-19 12:19:17.165"), orderSnapshot); 

    mongoTemplate.save(ordersAudit); 

    // Create and run the query 
    Date from = dateFormat.parse("2013-04-01 01:00:05.000"); 
    Date to = dateFormat.parse("2014-04-01 01:00:05.000"); 

    Query query = new Query(); 
    query.addCriteria(Criteria.where("orderSnapshot.releases.ffmCenterDesc").is("TW") 
           .and("orderSnapshot.releases.relStatus").is("d") 
           .andOperator(
              Criteria.where("orderSnapshot.placedTS").gt(from), 
              Criteria.where("orderSnapshot.placedTS").lt(to) 
             ) 
        ); 

    // Check the results 
    List<OrdersAudit> results = mongoTemplate.find(query, OrdersAudit.class); 
    Assert.assertEquals(1, results.size()); 
} 

public class OrdersAudit { 
    private Date createdTS; 
    private OrderSnapshot orderSnapshot; 

    public OrdersAudit(final Date createdTS, final OrderSnapshot orderSnapshot) { 
     this.createdTS = createdTS; 
     this.orderSnapshot = orderSnapshot; 
    } 
} 

public class OrderSnapshot { 
    private long orderId; 
    private Date placedTS; 
    private Release releases; 

    public OrderSnapshot(final long orderId, final Date placedTS, final Release releases) { 
     this.orderId = orderId; 
     this.placedTS = placedTS; 
     this.releases = releases; 
    } 
} 

public class Release { 
    String ffmCenterDesc; 
    String relStatus; 

    public Release(final String ffmCenterDesc, final String relStatus) { 
     this.ffmCenterDesc = ffmCenterDesc; 
     this.relStatus = relStatus; 
    } 
} 

注:

  • 這是一個TestNG的類,而不是JUnit的。
  • 我用SimpleDateFormat創建Java類Date類,這只是爲了方便使用。
  • 您爲relStatus粘貼的XML值包括已剝離的空格。

您向我們展示了XML中的文檔結構,而不是JSON,因此我必須假設您的數據是什麼樣子。我幾乎可以直接翻譯成JSON,所以它看起來像這樣在數據庫:

{ 
    "_id" : ObjectId("51d689843004ec60b17f50de"), 
    "_class" : "OrdersAudit", 
    "createdTS" : ISODate("2013-04-18T23:19:17.165Z"), 
    "orderSnapshot" : { 
    "orderId" : NumberLong(43060151), 
    "placedTS" : ISODate("2013-04-18T23:19:17.165Z"), 
     "releases" : { 
      "ffmCenterDesc" : "TW", 
      "relStatus" : "d" 
     } 
    } 
} 

你可以找到你真正的樣子做一個分貝。 <collectionName> .findOne()在mongoDB shell中調用。