【问题标题】:spring data mongodb query documentspring data mongodb查询文档
【发布时间】:2013-06-13 02:33:34
【问题描述】:

当我尝试使用 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)
                                 )
                 );

【问题讨论】:

  • 什么是空?查询变量,还是运行它的结果?如果是运行的结果,请显示调用查找,例如final List orders = mongoTemplate.find(query, Order.class);运行查询不应返回 null,如果没有找到结果,您将得到一个空列表。

标签: java mongodb spring-data


【解决方案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"
        }
    }
}

你可以通过在 mongoDB shell 中调用 db..findOne() 来找到你的真正样子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多