【问题标题】:Mongoose: Count array elementsMongoose:计算数组元素
【发布时间】:2021-10-10 17:38:38
【问题描述】:

我有以下带有 ObjectId 数组的架构:

const userSchema = new Schema({
    ...
    article: [{
        type: mongoose.Schema.Types.ObjectId,
    }],
    ...
},

我将计算上面示例中的数组元素,结果应该是 10。

我尝试了以下方法,但这对我不起作用。 req.query.id 是来自用户的 _id,将使用匹配的文章数组过滤特定用户。

const userData = User.aggregate(
    [
        {
            $match: {_id: id}
        },
        {
            $project: {article: {$size: '$article'}}
        },
    ]
)
console.log(res.json(userData));

console.log(article.length) 目前给我 0。我该怎么做?聚合函数是正确的选择还是其他更好的方法来计算数组的元素?

【问题讨论】:

  • 也许您的$match 舞台正在返回任何元素。尝试将req.query._id解析为ObjectId
  • 感谢您的评论。我已经更新了我的答案,并尝试了一个带有 $project 参数的新聚合函数。你知道如何显示我的 $size 变量吗?
  • await User.aggregate(...)
  • 是的,谢谢你们。现在它正在运行,这对我帮助很大。谢谢!

标签: javascript arrays mongodb mongoose


【解决方案1】:

当 id 数组已经与用户对象一起使用时,不确定为什么要使用聚合。

将文章字段定义为参考:

const {Schema} = mongoose.Schema;
const {Types} = Schema;

const userSchema = new Schema({
    ...
    article: {
      type: [Types.ObjectId],
      ref: 'Article',
      index: true,
    },
    ...
});

// add virtual if You want
userSchema.virtual('articleCount').get(function () {
  return this.article.length;
});

并使用填充获取它们:

const user = await User.findById(req.query.id).populate('articles');

console.log(user.article.length);

或者只是有一个 id 数组:

const user = await User.findById(req.query.id);

console.log(user.article.length);

利用虚拟场:

const user = await User.findById(req.query.id);

console.log(user.articleCount);

附:当我需要执行实际上是聚合的复杂后过滤逻辑时,我使用聚合。想想你有结果集,但是你希望在 db 端处理结果集有更具体的信息,如果你在循环内对 db 进行查询,这将是无效的。就像我需要获取按特定日期添加特定文章的用户并按小时对它们进行分区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2019-04-19
    • 1970-01-01
    • 2016-05-19
    • 2021-12-16
    相关资源
    最近更新 更多