【发布时间】:2018-04-10 12:44:53
【问题描述】:
我有以下 书籍 收藏。
例子:
{
"_id" : ObjectId("5acb4f817d63b61cb002bb01"),
"title" : "Book3",
"pubDate" : ISODate("2019-10-05T00:01:00.000Z"),
"relDate" : ISODate("2019-10-04T00:01:10.000Z"),
"place" : "Mysore"
}
这里我的要求是“列出所有存在(字段 place 和(pubDate > relDate 或其中一个或两个)的书籍pubDate/relDate 不存在)“。 我尝试了以下查询,但这里似乎缺少一些东西。
{$and: [ {place: {$exists: true}}, { '$where': {$or:[{'this.pubDate > this.relDate'}, {pubDate: {$exists: false}}, {relDate: {$exists: false}}] }} ] }
我收到以下异常:
Exception in thread "main" org.bson.json.JsonParseException: JSON reader was expecting ':' but found '}'.
at org.bson.json.JsonReader.readBsonType(JsonReader.java:129)
at com.mongodb.DBObjectCodec.readDocument(DBObjectCodec.java:345)
at com.mongodb.DBObjectCodec.readValue(DBObjectCodec.java:288)
at com.mongodb.DBObjectCodec.readArray(DBObjectCodec.java:335)
at com.mongodb.DBObjectCodec.readValue(DBObjectCodec.java:291)
at com.mongodb.DBObjectCodec.readDocument(DBObjectCodec.java:347)
at com.mongodb.DBObjectCodec.readValue(DBObjectCodec.java:288)
at com.mongodb.DBObjectCodec.readDocument(DBObjectCodec.java:347)
at com.mongodb.DBObjectCodec.readValue(DBObjectCodec.java:288)
at com.mongodb.DBObjectCodec.readArray(DBObjectCodec.java:335)
at com.mongodb.DBObjectCodec.readValue(DBObjectCodec.java:291)
at com.mongodb.DBObjectCodec.readDocument(DBObjectCodec.java:347)
at com.mongodb.DBObjectCodec.decode(DBObjectCodec.java:138)
at com.mongodb.DBObjectCodec.decode(DBObjectCodec.java:61)
at com.mongodb.BasicDBObject.parse(BasicDBObject.java:75)
at com.mongodb.BasicDBObject.parse(BasicDBObject.java:62)
at com.test.MongoTest.main(MongoTest.java:59)
我需要使用 $where 子句,因为我不能在现有代码设置中使用聚合操作。
Mongo 版本:3.2.6
请澄清。
【问题讨论】:
-
有什么错误吗?还是没有结果?
-
@GeorgeBailey 更新了异常问题。
-
我同意。但是我当前的代码设置不允许我使用聚合子句。
-
find和aggregate是 MongoDB Java 驱动程序中集合对象上的独立方法,因此您可能需要重新访问代码以创建允许使用aggregate的单独路径,其中这是给定表达式的最佳选择。 MongoDB 不推荐使用$where(原因在你之前创建的非常类似的question 中列出)。