Spring在MongoDB中投掷ConverterNotFound以进行范围搜索

时间:2015-11-25 15:55:23

标签: mongodb datetime mongodb-query spring-data-mongodb mongodb-java

我正在尝试对DateTime数据格式进行范围搜索。日期存储在MongoDB中的Joda的DateTime格式中。

当我对大于给定日期的数据执行FIND查询时,抛出ConverterNotFoundException。

有人可以分享有关Date对象为何与DateTime(Joda)进行对话的信息,以及如何解决这个问题?

异常

Query: { "monthYear" : { "$gte" : { $java : 2014-01-01T00:00:00.000+01:00 } } }, Fields: null, Sort: null

申请代码

@DateTimeFormat(iso = ISO.DATE_TIME)
    private DateTime monthYear;

生成的查询如下所示:

    <div id="top"><center><img src="images/header.png" style="max-width:100%;"></center></div>
<header id="header" class="site-header" role="banner">
<div id="header-inner" class="container sixteen columns over">
<hgroup class="one-third column alpha">

</hgroup>
    <nav id="main-nav" class="two thirds column omega">
        <ul>
            <li>
                <a href="index.html">Home</a>
            </li>
            <li>
                <a href="about-us.html">About Us</a>
            </li>
            <li>
                <a href="news.html">News</a>
            </li>
            <li>
                <a href="dealers.html">Dealers</a>
            </li>
            <li>
                <a href="products.html">Products</a>
            </li>
            <li>
                <a href="http://www.cosworth-europe.co.uk/shop">Buy Online</a>
            </li>
            <li>
                <a href="contact.html">Contact</a>
            </li>
        </ul>
    </nav>

</div>

</header>
模型类

中使用的

注释

#top {background-image: url(../images/header-gradient.gif);
 background-repeat: repeat-x; 
 max-width:100%;
 height:110px;}

#header {margin-top: -5px; margin-bottom: 30px;}
h1 a { text-indent: -9999px; }
#site-title { padding-top: 10px;}

#main-nav { 
    position:absolute;
    right:120px;
    bottom:0px; 
}

#main-nav ul, #main-nav li {display: inline; padding: 7px;}
#main-nav a {text-decoration:none; color: black;}

1 个答案:

答案 0 :(得分:0)

在调查此行为后,发现了以下问题和解决方案。

<强>问题

从不同的MongoDB UI读取数据类型时,对MongoDB中存储的数据的解释会有所不同。例如:Mongovue将类型解释为DateTime,DBeaver将其解释为Timestamp

<强>解决方案 使用日期格式的日期时间对象从应用程序中查询数据库。

示例

int year;
DateTime monthYearFrom = new DateTime(year, 1, 1, 1, 0);
DateTime monthYearTo = new DateTime((year+1), 1, 1, 1, 0);
query.addCriteria(Criteria.where("monthYear").gte(monthYearFrom.toDate()).lte(monthYearTo.toDate()));