草庐IT

node.js - MongoDB - $nin 聚合运算符无效

coder 2023-11-07 原文

我有一个函数应该返回在给定时间段内创建的用户数以及受邀者和未受邀者的分组。在 $cond 运算符上,我需要比较字段 tkbSponsor 是否不是 null 并且不等于 example@example.com 。如果此条件结果为真,则用户被邀请。否则,他不会被邀请。

var countByPeriod = function(req,res) {
    var initialDate = req.body.initialDate;
    var finalDate = req.body.finalDate;

    User.aggregate([
        {
            "$match": {
                "timeStamp": {
                    "$gte": new Date(initialDate),
                    "$lt": new Date(finalDate)
                }
            }
        },
        {
            "$group": {
                "_id": null,
                "total": { "$sum": 1 },
                "invited": {
                    "$sum": {
                        "$cond": [
                            { 
                                "tkbSponsor": {
                                    "$nin": ["example@example.com",null] 
                                }
                            },
                            1,
                            0
                        ]
                    }
                }
            }
        }
    ], (err,result) => {
        if (!err)  {
            if (result.length) res.send(result[0]);
            else res.send({"total": 0,"invited":0});
        } else {
            res.sendStatus(500);
            console.log(err);
        }

    });

};

顺便说一句,这个函数在执行时给我一个错误:

{ [MongoError: invalid operator '$nin']
  name: 'MongoError',
  message: 'invalid operator \'$nin\'',
  ok: 0,
  errmsg: 'invalid operator \'$nin\'',
  code: 15999 }

只是一个观察。我曾经像下面那样使用 $cond 运算符,因为我不需要与 null 进行比较:

"$cond": [
           { 
             "$ne": ["$tkbSponsor", "example@example.com"]
           },
           1,
           0
]

而且它有效。但是,现在我还必须比较 tkbSponsor 是否不为 null 并且使用 $nin 会给我这个错误。

最佳答案

更改为使用 $and 连同 $ifNull 合并为:

{
    "$cond": [
        { 
            "$and": [
                { "$ne": ["$tkbSponsor", "example@example.com"] },
                { 
                    "$ne": [
                        { "$ifNull": [ "$tkbSponsor", null ] },
                        null
                    ] 
                }
            ]
        }, 1, 0
    ]
}

或使用 $or作为

{
    "$cond": [
        { 
            "$or": [
                { "$eq": ["$tkbSponsor", "example@example.com"] },
                { 
                    "$eq": [
                        { "$ifNull": [ "$tkbSponsor", null ] },
                        null
                    ] 
                }
            ]
        }, 0, 1
    ]
}

$ifNull 运算符的存在是通过将“不存在”或空字段替换为 null 值来充当 $exists 运算符评估。

运行它应该返回正确的结果作为早期的 revision 仅评估 tkbSponsor 字段存在 且值为 null 或“example@example.com”的文档。

$ifNull ,“不存在的”字段也被评估为运算符(operator)给他们 null 值。

关于node.js - MongoDB - $nin 聚合运算符无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41512406/

有关node.js - MongoDB - $nin 聚合运算符无效的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  3. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  4. ruby - 如何排除无效日期 ruby - 2

    我想知道我应该引用什么异常名称。我的日期无效。我检查了文档,但找不到。BeginDate.new(day,month,year)Rescueexceptionnamestatements 最佳答案 我认为您正在寻找ArgumentError.使用irb:>Date.new(2,-200,3)ArgumentError:invaliddatefrom(irb):11:in`new'from(irb):11所以beginDate.new(2,-200,3)rescueArgumentError#yourlogicend

  5. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  6. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  7. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  8. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  9. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  10. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

随机推荐