【问题标题】:MongoDB: how to do $or with $where (it doesn't do logical OR)MongoDB:如何用 $where 做 $or (它不做逻辑 OR)
【发布时间】:2014-03-31 10:30:23
【问题描述】:

我们如何使用 $or 和这样的 $where 子句?

此查询应始终返回所有记录(因为日期为 2015 年),但它不返回任何内容。

在部分情况下,它可以工作,但是当尝试将 $or 应用于 Date 或 $where 时,它​​无法按预期工作。

感谢 Sammaye 将我以前的版本修复为以下(但仍然无法正常工作):



db.turnys.find({
       $or:[
            { start:{
               $lte:new Date("2015-03-31T09:52:29.338Z")
            } },
            { $where:"this.users.length == this.seats" }
       ]
});

我怎样才能完成预期的 $or?

这里是 turnys 系列的示例:

[
  {
    "gId": "5335e4a7b8cf51bcd054b423",
    "seats": 2,
    "start": "2014-03-31T08:47:48.946Z",
    "end": "2014-03-31T08:49:48.946Z",
    "rMin": 800,
    "rMax": 900,
    "users": [],
    "_id": "53392bb42b70450000a834d8"
  },
  {
    "gId": "5335e4a7b8cf51bcd054b423",
    "seats": 2,
    "start": "2014-03-31T08:47:48.946Z",
    "end": "2014-03-31T08:49:48.946Z",
    "rMin": 1000,
    "rMax": 1100,
    "users": [],
    "_id": "53392bb42b70450000a834da"
  },

谢谢!

【问题讨论】:

  • 展示你的一些文件怎么样?
  • 这不是如何格式化 $or 查询,它实际上是一个带有 $and 的 $or 子句

标签: mongodb mongodb-query


【解决方案1】:

问题是$ors 不是这样工作的,实际上你需要的是:

db.turnys.find({
   $or:[
        { start:{
           $lte:new Date("2015-03-31T09:52:29.338Z")
        } },
        { $where:"this.users.length == this.seats" }
   ]
});

现在将创建一个带有两个子句的$or 查询。 $or 数组的每个元素都被归类为 $anded 子句。

【讨论】:

  • @mylord 对不起,我没有回来,有点忙,很高兴听到它有效 :)
【解决方案2】:

正如我在您的 other question 中提到的那样,应该避免使用 $where 运算符,如其中给出的原因所示。

再次如图所示,您应该做的是在文档中“分配”total_users 值,在更新时使用 $inc 运算符。但是使用.aggregate(),您的“查询”应该是这样的:

db.collection.aggregate([
    { "$project": {
        "gId": 1,
        "start": 1,
        "alloc": { "$eq": [ "$total_users", "$seats" ] }
    }},
    { "$match": {
        "$or": [ 
           { "alloc": 1, },
           { "start": { "$lte": new Date("2015-03-31T09:52:29.338Z") } }
        ]
    }}
])

或者甚至可能使用 MongoDB 的更多最近版本(仍待发布)中提到的“数组大小”形式。

但也要“澄清”您需要以确保您的“测试”操作确实有效。

【讨论】:

  • 当我在 mongo shell 中尝试此操作时(将 gId 替换为真正的 gId 后,我得到:JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL 任何想法?我可以在 shell 旁边使用什么工具?跨度>
  • @mylord No. $project 以1 为值表示“包含”此字段。因此,您要么将 1 用于 true,要么在此字段中实际上只使用 $gId 中的字段值
  • 糟糕,我需要添加 total_users。我想 +1,但仍然不能:/
  • @mylord 要点是,除了您的逻辑中可能存在的任何其他问题外,您不应该接受 $where 的使用(我已经指出了这一点),因为这对你的申请。首先理清你的一般选择问题。并保持推荐的用法来处理数组的长度和比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多