通过 Mongoose 更新多个子文档?

2023-11-30

举例来说,我们使用以下模式来定义评论树;

{
    "_id" : ObjectId("id_here"),
    "parentComment" : "This is my opinion",
    "isHidden" : false,
    "comments" : [ 
        {
            "comment" : "I disagree with your opinion",
            "isHidden" : false
        }, 
        {
            "comment" : "Test Post",
            "isHidden" : false
        }, 
        ....
}

因此,如果我们要更新父注释以将禁止短语的 isHidden 标志设置为 true,我们会这样做;

        var userComments = require('mongoose').model("UserComments");
        for (let i = 0; i < bannedPhrases.length; i++) {
            var conditions = { parentComment: bannedPhrases[i] }
                , update = { isHidden: true}
                , options = { multi: true };

            userComments.update(conditions, update, options, callback);
        }

现在,考虑子文档“评论”(线索评论、多个条目)——我们如何才能更新这些内容?


我能想到的解决方案就是将嵌套文档一一更新。

假设我们已经掌握了禁用短语,它是一个字符串数组:

var bannedPhrases = ["censorship", "evil"]; // and more ...

然后我们执行查询来查找所有UserComments其中有comments包含任何bannedPhrases.

UserComments.find({"comments.comment": {$in: bannedPhrases }});

通过使用 Promise,我们可以一起异步执行更新:

UserComments.find({"comments.comment": {$in: bannedPhrases }}, {"comments.comment": 1})
  .then(function(results){
    return results.map(function(userComment){

       userComment.comments.forEach(function(commentContainer){
         // Check if this comment contains banned phrases
         if(bannedPhrases.indexOf(commentContainer.comment) >= 0) {
           commentContainer.isHidden = true;
         }
       });

       return userComment.save();
    });
  }).then(function(promises){
     // This step may vary depending on which promise library you are using
     return Promise.all(promises); 
  });

如果你使用蓝鸟JS是Mongoose的promise库,代码可以简化:

UserComments.find({"comments.comment": {$in: bannedPhrases}}, {"comments.comment": 1})
    .exec()
    .map(function (userComment) {

        userComment.comments.forEach(function (commentContainer) {
            // Check if this comment contains banned phrases
            if (bannedPhrases.indexOf(commentContainer.comment) >= 0) {
                commentContainer.isHidden = true;
            }
        });

        return userComment.save();
    }).then(function () {
    // Done saving
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Mongoose 更新多个子文档? 的相关文章

  • Grunt:自定义任务开发指南

    我需要实现一个自定义的 Grunt 任务 但我完全不知道开发工作流程 如何开发自定义任务并在开发过程中使用 npm 模拟加载它 除了使用之外 还有其他分配自定义任务的方法吗 npm 我的意思是 我可以分发一个定义整个自定义 Grunt 任务
  • 页面路由不完全是我想要的

    我在下面的代码中使用 Angular Routing 将用户引导至新的注册表单 该应用程序的工作原理如下 用户看到一个网页 要求他们通过单击适当的按钮在 数字报价 或 屏幕报价 之间做出选择 单击该按钮后 它应该将其定向到另一个显示相应注册
  • 如何使用匹配、排序和限制对 MongoDB 聚合进行排序

    我当前的聚合是 db group members aggregate match user id in 1 2 3 group id group id sort last post at 1 limit 5 对于以下文档结构 id user
  • 双等号 (==) 和三等号 (===) 之间的 JavaScript 性能差异

    在 JavaScript 中 使用双等号 与使用三等号 例子 if foo bar vs if foo bar 如果比较的类型相同 它们是相同的 也就是说他们用完全相同的算法 如果类型是不同的 那么性能就无关紧要了 您要么需要类型强制 要么
  • 无法使用IP地址访问WebStorm内部服务器

    我在 PC 上安装了 WebStorm 并启动了 NodeJS 服务器 我可以使用 Chrome 和 Firefox 浏览器访问它localhost但不是我电脑的 IP 地址 我按照给出的指示进行操作here https intellij
  • 玩笑 toEqual 不适用于异常匹配

    我是新来的jest所以我不确定是否是我的错 这是我的测试用例 it should throw error if wrong email or phone number is provided async gt await expect us
  • Puppeteer - 错误:协议错误 (Network.getResponseBody):找不到具有给定标识符的资源

    我正在尝试使用此代码使用 puppeteer 从网站获取响应正文 usr bin env node require dotenv config const puppeteer require puppeteer const readline
  • Node.js:301 重定向非 www,不带 Express

    对于现有项目 我只想做一个简单的更改 将 www mysite com 重定向到 mysite com 因为 cookie 问题 非 www 版本无法访问 www 上的 cookie 我不想包括快递 我该如何做这个简单的改变 我认为这就是您
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • 无法使用 Mongo 导出查询

    我有一个名为 sample 和名为 的数据库at 存在于 Mongodb 中 db sample find pretty id 35004 city ACMAR pop 6055 state AL id 35005 city ADAMSVI
  • NodeJS:创建 zip,但在磁盘上,而不是在内存中

    我需要创建一个包含大约 1GB 数据的 zip 文件 但该数量将来会增加 最初我用 AdmZip 构建了这个 但由于我们的虚拟机没有大量内存 也不需要它 除了创建这个 zip 文件时 所以我不想扩展 它运行内存不足并崩溃 然后我重建了该过程
  • Nodejs mongodb 的 Transaction API `withTransaction` 总是返回 null

    我想从 mongodb 返回某些结果withTransaction功能 但是 我似乎无法返回除 null 之外的任何内容 官方文档中记录了应该返回承诺 https mongodb github io node mongodb native
  • Heroku 无法获取 /

    我是 Heroku 的新手 相信我正在按照 Heroku 网站上概述的所有步骤通过 node js 进行部署 https devcenter heroku com articles getting started with nodejs h
  • 在 AngularJS 和 Nodejs 之间共享代码

    使用在前端和后端之间共享代码的最佳方式是什么javascript 特别是说之间nodejs and angularjs 问题是我们使用的是相同的enums and constant values例如error codes在后端和前端 现在
  • jade模板条件类nodejsexpressjs

    我的标题有一个 jade 模板文件 并使用引导标记 根据用户所在的页面 导航栏需要将 active 类添加到该导航项 避免这样的长代码的最佳方法是什么 header jade if nav home li active a href Hom
  • 如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?

    Github 告诉我 我的 package lock json 文件中的依赖项容易受到攻击且已过时 问题是如果我这样做npm install or npm update 它们都没有更新 package lock json 文件中的依赖项 我
  • JavaScript 回调的效率

    我只是想证实我的一个怀疑 我偶然发现了一篇文章 建议按以下方式使用 Socket io var app require express createServer var io require socket io listen app app
  • Node.js -Firebase 服务帐户私钥无法解析

    I use env我的 app js 文件中的变量用于访问密钥 一切都工作正常 直到我下载了一个新的Firebase Service Account Private Key 当我用新值替换旧值时 我无法再访问该密钥 因为terminal当我
  • Mongoose:ObjectId 比较失败不一致

    我有一个简单的工具 用于构建文档集合 然后自动格式化它们以进行 EPUB 或 LaTeX 渲染 该工具是在 ExpressJS 之上编写的 我正在使用 Coffeescript 如果这很重要的话 我对此表示怀疑 使用猫鼬 我有以下内容 Do
  • 如何从 MongoDB 集合中删除旧记录?

    如何从集合中删除超过 7 天的旧文档 orderID 456986 orderType OnlinePurchase orderStatus expired address Hexel payement Card isDomestic tr

随机推荐