我有以下书籍集合。
示例:的
{
"_id" : ObjectId("5acb4f817d63b61cb002bb01"),
"title" : "Book3",
"pubDate" : ISODate("2019-10-05T00:01:00.000Z"),
"relDate" : ISODate("2019-10-04T00:01:10.000Z"),
"place" : "Mysore"
}
此处我的要求是“列出所有图书(字段地方存在)和( 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
请澄清。
答案 0 :(得分:1)
尝试
{
"$and":[
{"place":{"$exists":true}},
{"$or":[
{"$where":'this.pubDate > this.relDate'},
{"pubDate":{"$exists":false}},
{"relDate":{"$exists":false}}
]}
]
}
你不需要$and
。你可以简化到
{
"place":{"$exists":true},
"$or":[
{"$where":'this.pubDate > this.relDate'},
{"pubDate":{"$exists":false}},
{"relDate":{"$exists":false}}
]
}