gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:50:27 26 4
gpt4 key购买 nike

我有一个函数应该返回在给定时间段内创建的用户数以及受邀者和未受邀者的分组。在 $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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com