【问题标题】:How to use $where with $or in mongo db?如何在 mongodb 中使用 $where 和 $or?
【发布时间】: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 更新了异常问题。
  • “我需要使用 $where 子句,因为我不能在现有代码设置中使用聚合操作。” ...您的陪伴question 包括一个answer,它显示了使用聚合而不是$where,并且该答案对MongoDB v3.2.6有效
  • 我同意。但是我当前的代码设置不允许我使用聚合子句。
  • findaggregate 是 MongoDB Java 驱动程序中集合对象上的独立方法,因此您可能需要重新访问代码以创建允许使用 aggregate 的单独路径,其中这是给定表达式的最佳选择。 MongoDB 不推荐使用$where(原因在你之前创建的非常类似的question 中列出)。

标签: java mongodb


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2012-01-30
    相关资源
    最近更新 更多