MongoDB 更新和聚合问题:跳过聚合

Posted

技术标签:

【中文标题】MongoDB 更新和聚合问题:跳过聚合【英文标题】:MongoDB Update & Aggregate Problem: Skipping over aggregation 【发布时间】:2021-11-04 17:10:12 【问题描述】:

我有两张表,一张用于记录消息,一张用于组中的每个成员。当一条消息被投票时,我想为该消息添加一个条目并将对该消息的每个反应推送到一个数组。

每次添加反应时,我都想更新成员表以反映所有反应值字段的总和。

这是我为此编写的代码。当它从我在 VisualStudio 中使用 MongoDB 添加的沙箱运行时,它运行良好,但是当使用我的应用程序运行时,只添加了消息文档并且没有任何错误,它似乎跳过聚合到成员文档。

这是我用来将文档插入数据库并在插入文档后进行聚合的代码:

await mongodb.collection("Messages").updateOne( _id: reaction.message.id.toString(),
         
            $set:
            authorid: reaction.message.author.id,
            author: reaction.message.author.username
            ,
    
            $push:  
                reactions:  
                reauth: reAuth, 
                reaction: reaction.emoji.name, 
                removed: false, 
                value: actualKarmaDB,
                
            
            , safe: true, "upsert": true)
            
    await mongodb.collection("Messages").aggregate([
    
            $match:  
                _id: reaction.message.id
            
    ,
    
        $project: 
            _id: "$authorid",
            username: "$author",
            messageKarma: $sum: "$reactions.value",
            

    ,
       $merge:  
            into: "Members", 
            on: "_id", 
            whenMatched: "replace", 
            whenNotMatched: "insert" 
             
    ])

这里也看看插入“消息”的样子:

【问题讨论】:

【参考方案1】:

在这种情况下,答案是由于 mongoose 不支持聚合合并。不得不使用 $out。

此外,这是 Mongoose Node.js 的一个已知问题,请参见此处: Mongodb node.js $out with aggregation only working if calling toArray()

【讨论】:

以上是关于MongoDB 更新和聚合问题:跳过聚合的主要内容,如果未能解决你的问题,请参考以下文章

Spring Mongo 聚合查询以从 MongoDB 获取不同的国家名称和国家代码

mongodb高级聚合查询

Mongo 聚合游标和计数

mongoDB应用篇-mongo聚合查询

mongodb高级聚合查询

Mongo高级用法