如何通过一个请求更新数组对象的多个字段?

2023-12-08

{
   _id:xxxxstoreid
    store:{
        products:[
            {
                _id:xxxproductid,
                name:xxx,
                img:url,
            }
        ]
    }
}

由于我无法预测更新请求,参数可能只有名称,也可能两者都有。

这是我的查询,它更新成功,但如果参数中不存在其他字段,它会删除它们。 例如:

var params={_id:xxid,name:'xxx',img:'xxx'}

or

var params={_id:xxid,name:'xxx'}

在这种情况下,如果参数只有名称,它将删除 img 字段并更新。

User.update({'store.products._id':params._id},{$set:{"store.products":params}},callback);

您需要提供多个密钥$set位置性的$操作员更新两个匹配的密钥。

我更喜欢现代 ES6 的对象操作方式:

let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };

let update = [
  { 'store.products._id': params._id },
  { "$set": Object.keys(params).filter(k => k != '_id')
    .reduce((acc,curr) =>
      Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
    { })
  }
];

User.update(...update,callback);

这将产生对 MongoDB 的调用 ( withmongoose.set('debug', true))打开,所以我们看到请求:

Mongoose: users.update({ 'store.products._id': 'xxxproductid' }, { '$set': { 'store.products.$.name': 'xxx', 'store.products.$.img' : 'yyy' } }, {})

基本上你在哪里接受你的输入params并提供_id作为“查询”的第一个参数:

  { 'store.products._id': params._id },

其余部分通过以下方式从对象中获取“键”Object.keys这使得我们可以用它来“过滤”一个“数组”Array.filter()然后传递给Array.reduce将这些键转换为Object.

在 - 的里面.reduce()我们称之为Object.assign()它将对象与给定的键“合并”,以这种形式生成:

  Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),

使用模板语法将“当前”(curr)“key”分配给新的键名称,再次使用ES6 按键分配语法[]:它允许对象文字中的变量名称。

生成的“合并”对象被传回并分配给“根”对象,其中$set用于更新的密钥,因此“生成的”密钥现在是其子密钥。

我使用数组作为参数纯粹是为了调试目的,但这也允许实际的语法更清晰.update()使用“传播”...运算符来分配参数:

User.update(...update,callback);

简洁明了,还有一些您应该学习的用于对象和数组操作的 JavaScript 技术。主要是因为 MongoDB 查询 DSL 基本上是“对象”和“数组”。所以要学会操纵它们。

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

如何通过一个请求更新数组对象的多个字段? 的相关文章

随机推荐

  • 对类中变量的线程安全访问

    在可能有多个线程运行的应用程序中 并且不确定是否在多线程环境下访问这些方法的可能性 但为了安全起见 我做了一个测试类来演示一种情况 一种方法has被编程为线程安全 如果做得正确 也请发表评论 但其余的则不是 在这样的情况下 里面只有一行代码
  • 大 (> 4mb) 文件附件

    使用 Microsoft Graph API 可以将文件附件添加到消息中 如下所述here 但是 由于 REST 请求的总大小限制为 4mb 因此不允许包含非常大的附件 A 可恢复上传会话允许更大的上传 可以通过提供下载链接的参考附件进行引
  • 使用 Android Parse 的多个组合“或”查询

    在 Android 的 Parse 中 是否可以对多个 OR 子查询进行 AND 操作 我一直在尝试组合两个 OR 查询 但没有成功 根据我的研究 Parse 可能不具备这种能力 不过 我还没有找到任何东西来证实 否认这一点 例如 给定一堆
  • 如何使位图透明?

    param bitmap The source bitmap param opacity a value between 0 completely transparent and 255 completely opaque return T
  • Java 8 中方法引用的外部参数

    我希望将外部参数传递给方法引用 String prefix The number is numbers forEach Main printWithPrefix private static void printWithPrefix Int
  • 保护目录免遭直接 URL 访问

    需要一些帮助 我需要保护所有的FOLDERS in a DIRECTORY from direct URL使用权 我可以这样做吗 htaccess如果是 怎么办 或者他们是更安全的方法 这是我的情况 我允许用户上传 pdf 文件 文件发送至
  • MySQL - 组内计数器

    我想根据升序变量为组中的每一行添加一个计数器 我有一个解决方案 但如果组内的某些变量相等 它就不起作用 CREATE TABLE tb g CHAR 1 x INTEGER INSERT INTO tb g x VALUES a 1 a 2
  • 如何使用JNA回调

    我正在使用 JNA 调用 dll 文件的函数 简单DLL h typedef int stdcall eventCallback unsigned int id int value namespace test class hotas pu
  • 在 ARM 资源组中运行的 Webrole 云服务

    到目前为止 我对使用 WebRoles 或 Worker Roles 进行 PaaS 部署的理解 旋转Web角色或工作者角色将创建云服务来管理它 然而 在ARM资源组中 他们没有云服务的概念 那么在ARM资源组中如何管理Web和Worker
  • 如何更改 Microsoft.AspNet.Identity.EntityFramework.IdentityUser 中的 id 类型

    ASP NET MVC 5 EF6 VS2013 我正在想办法将 Id 字段的类型从 string 更改为 int在类型中 Microsoft AspNet Identity EntityFramework IdentityUser 以便让
  • 决策树分类器抛出 KeyError: 'log_loss'

    我使用sklearn的决策树 通常有log loss classifier DecisionTreeClassifier random state 42 class weight balanced criterion log loss cl
  • NSLog 显示前一个日期

    我想检索两个日期之间添加的核心数据中的所有条目 我正在使用NSPredicate 由于我没有得到正确的结果 我尝试记录日期 它显示了以前的日期 在谷歌搜索一段时间后 我添加了 dateFormatter setTimeZone NSTime
  • 将 UITabBar 定位在顶部

    我是 iOS 开发的初学者 我的问题是 是否可以将 UITabBar 放置在顶部以及如何放置 我无法将 UITabBar 放置在视图的顶部 是否可以 当然可以 但它违反了人机界面准则 截图 Code TabController h impo
  • 如何更改 ggplot2 中特定几何图形的大小?

    我有一个包含 2 层的 ggplotgeom point and geom line如下所示 gp lt ggplot data mtcars aes x disp y hp geom point size 3 geom line size
  • 如何在 HTML5 的画布中复制形状?

    我正在尝试使用 HTML5 构建一个半复杂且水平对称的形状 当我试图完成它时 我意识到如果我可以复制一半形状 镜像它并移动它以将两个图像连接在一起会更容易 我正在寻找如何镜像和移动形状的示例 但没有找到如何复制它的示例 显然 我希望不需要两
  • 加载配置文件时,Selenium 测试需要几分钟才能启动

    我只是想弄清楚是否有其他人看到他们的 Selenium 测试在将配置文件加载到 FirefoxDriver 时运行速度明显变慢 需要 2 分钟以上才能启动 如下所示 Selenium 是 Firefox 的默认配置文件 上述帖子的问题发起者
  • 关于dispatch_queue、重入和死锁的澄清

    我需要澄清如何dispatch queues 与重入和死锁有关 阅读这篇博文iOS OS X 上的线程安全基础知识 我遇到了这句话 所有调度队列都是不可重入的 这意味着如果 您尝试在当前队列上进行dispatch sync 那么 可重入和死
  • Python asyncio:处理可能无限的列表

    我有以下场景 Python 3 6 输入数据是从文件中逐行读取的 协程将数据发送到 API 使用aiohttp 并将调用结果保存到 Mongo 使用motor 所以有很多 IO 发生 代码是用async await 并且对于手动执行的单个调
  • PHP 保护 PDF 和 DOC

    我正在努力提供 pdf and doc文件发送给网站上的授权用户 用户只能在登录时看到文件选择页面 但这并不能阻止未经授权的用户在知道完整 URL 的情况下查看文档 如何防止未经授权的用户访问这些文件 答案很简单 Jonnix 在我打字时发
  • 如何通过一个请求更新数组对象的多个字段?

    id xxxxstoreid store products id xxxproductid name xxx img url 由于我无法预测更新请求 参数可能只有名称 也可能两者都有 这是我的查询 它更新成功 但如果参数中不存在其他字段 它