【问题标题】:Variable not defined MongoDB $function变量未定义 MongoDB $function
【发布时间】:2021-05-29 13:00:29
【问题描述】:

好吧,我很困惑。我正在尝试使用 $function 运算符查找文档,如下所述:S_function

我的模特:

const newsSchema = new mongoose.Schema({
news_id: {
    type: mongoose.Schema.Types.ObjectId,
    unique: true,
    index: true
},
created_at: { type: String, default: Date.now().toString() },
updated_at: { type: String, default: Date.now().toString() },
Company_id: [{type: mongoose.Schema.Types.ObjectId}],
Stock_id: [{type: mongoose.Schema.Types.ObjectId}],
newsItem: {
    date: {type: String},
    title: { type: String },
    summary: { type: String },
    url: { type: String, unique: true },
    content: { type: String }
}
};

我的代码尝试:

newsModel.aggregate([
        {$match: {$function: {
            body: matchArrToArr(matchArr, Company_id),
            args: [ "$Company_id" ],
            lang: "js"
         }}}
    ])

matchArr 是我从周围函数传入的变量,Company_id 应该是新闻文档中的数组 'Company_id'。但是,当我执行该函数时,会返回错误“Company_id is not defined”。这是有道理的,因为我没有定义它,但是如何将 Company_id 字段放入函数中。

我也尝试了 find($expr:{$function:... 的结果相同,$where:... 的结果相同 this.Company_id 。第一种情况相同的错误。第二种情况 'this' 具有我调用 JS 函数的状态,而不是 DB 文档。

我实际上想要做的是:我想返回所有文档,其中 Company_id 数组中的一个 ID 与我传入的一个 ID 匹配。如果有更好的聚合方式而没有 $function,我是开放的到那个。但我也想了解我的 $function 表达式做错了什么。

谢谢!

【问题讨论】:

  • 函数声明和函数调用是两个不同的this。您需要定义一个函数而不是调用它。 MongoDB 将调用您将其作为参数传递给body 属性的函数。不要调用matchArrToArr 函数。用函数定义替换它。
  • 尝试更新问题。如果还是不行,我会帮你的。
  • 天哪,你是完全正确的,愚蠢的我。也许我的 3 天没有食物显示。非常感谢!

标签: javascript mongodb mongoose aggregation-framework aggregation


【解决方案1】:

这就是你想要的:

let someCompany_id = "60278ce8b370ff29b83226e7";

db.news.find(
    {
        $expr: {
            $function: {
                body: function(company_ids, someCompany_id) {
                    let _ids= company_ids.map(company_id => company_id.valueOf());
                    return _ids.includes(someCompany_id);
                },
                args: ["$company_id", someCompany_id],
                lang: "js"
            }
        }
    }
)

但这可以像这样轻松完成:

db.news.find({ 
    company_id: {
        $in: [someCompany_id]
    }
});

那你为什么要传递函数呢?

【讨论】:

  • 是的,我是在调用而不是传递函数。像往常一样,当我被卡住时,这是最愚蠢的错误。我不能只做一个简单的查找的原因是输入和匹配 ID 都是数组,如果只有一个匹配,我想要一个匹配。所以 [someId1,someId2] 和 [someId2, someId3] 应该返回 true,
猜你喜欢
  • 2011-06-11
  • 2021-02-27
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多