MongoDB:如何使用$where执行$or(它不执行逻辑or)
我们如何将$or与这样的$where子句一起使用 此查询应始终返回所有记录(因为日期为2015年),但不返回任何内容 在某些情况下,它是有效的,但当尝试将$or应用于日期或$where时,它并没有按预期工作 感谢Sammaye修复了我以前的版本,但仍无法正常工作: 我如何完成预期的$or 以下是turnys系列的示例:MongoDB:如何使用$where执行$or(它不执行逻辑or),mongodb,mongodb-query,Mongodb,Mongodb Query,我们如何将$or与这样的$where子句一起使用 此查询应始终返回所有记录(因为日期为2015年),但不返回任何内容 在某些情况下,它是有效的,但当尝试将$or应用于日期或$where时,它并没有按预期工作 感谢Sammaye修复了我以前的版本,但仍无法正常工作: 我如何完成预期的$or 以下是turnys系列的示例: [ { “gId”:“5335e4a7b8cf51bcd054b423”, “席位”:2, “开始”:“2014-03-31T08:47:48.946Z”, “结束”:“20
[
{
“gId”:“5335e4a7b8cf51bcd054b423”,
“席位”:2,
“开始”:“2014-03-31T08:47:48.946Z”,
“结束”:“2014-03-31T08:49:48.946Z”,
“rMin”:800,
“rMax”:900,
“用户”:[],
_id:“53392bb42b70450000a834d8”
},
{
“gId”:“5335e4a7b8cf51bcd054b423”,
“席位”:2,
“开始”:“2014-03-31T08:47:48.946Z”,
“结束”:“2014-03-31T08:49:48.946Z”,
“rMin”:1000,
“rMax”:1100,
“用户”:[],
_id:“53392bb42b70450000a834da”
},
谢谢!问题在于,
$或
s不是这样工作的,实际上您需要的是:
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") } }
]
}}
])
现在,这将创建一个带有两个子句的
$或查询。$或数组的每个元素都被归类为$和ed子句。正如我在您的上提到的,应该避免使用操作符,如给出的原因所示
同样,如图所示,您应该在更新时使用$inc操作符在文档中“分配”一个总用户数值。但是,您的“查询”应该如下所示:
或者甚至可能使用MongoDB的更新版本(截至撰写时仍将发布)中提到的“数组大小”形式
但是,为了“澄清”,您需要确保您的“测试”操作实际上是有效的。显示一些文档如何?可能的重复不是如何格式化$or查询,实际上是一个带有$and的$or子句,当我在mongo shell中尝试此操作时(在用真正的gId替换gId后,我得到:JavaScript执行失败:语法错误:意外标记非法任何想法?除了shell之外,我可以使用什么工具?@mylord No.$project,值为1
表示“包括”这个字段。所以你可以使用1
来表示true
,或者在这个字段中,你实际上只使用了$gId
Oops中的字段值。首先,我需要添加总用户数。我想+1,但仍然不能:/@mylord Point是,除了逻辑中可能存在的任何其他问题之外,你不应该接受$where的用法(我已经指出了这一点)因为这对您的应用程序来说不是个好消息。请首先解决您的一般选择问题。并遵循处理数组长度和比较的建议用法。@mylord抱歉,我没有回来,有点忙,很高兴听到它起作用:)
[
{
"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"
},
db.turnys.find({
$or:[
{ start:{
$lte:new Date("2015-03-31T09:52:29.338Z")
} },
{ $where:"this.users.length == this.seats" }
]
});
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") } }
]
}}
])