如何在$或mongo db中使用$ where?

时间:2018-04-10 12:44:53

标签: java mongodb

我有以下书籍集合。

示例:

{
    "_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

请澄清。

1 个答案:

答案 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}}
  ]
}