javascript - 我有一个 id 数组,需要更新对象文档 mongodb 中数组中的匹配对象,如果没有则插入

标签 javascript node.js mongodb

I need to update the document's array element in mongodb, I have multiple ids of that array. I need to update the matching element in that array.

data= [
   {
    "planId" : "plan_FVNvrmjWT7fRDY", 
    "startTime": ISODate("2019-07-30T07:05:23.000Z")
   },
   {
    "planId" : "plan_FVNvCvm7Qg5uYB", 
    "startTime": ISODate("2019-07-30T07:05:23.000Z"),
   },
   {
    "planId" : "plan_FVNvrmjWT7fRAS", 
    "startTime": ISODate("2019-07-30T07:05:41.000Z"),
   }
   ]

   document = { 
   "_id" : ObjectId("5d3fec3982d76f26f34afdc5"),
   "customerId" : ObjectId("5d383013647a3c42835fd7e6"),
   "__v" : 0,
   "createdAt" : ISODate("2019-07-30T07:05:29.986Z"),
   "subscriptions" : [ 
       {
           "_id" : ObjectId("5d3fec39c81f463a257862d0"),
           "planId" : "plan_FVNvrmjWT7fRDY",
           "startDate" : ISODate("2019-07-30T07:05:23.000Z"),
           "endDate" : ISODate("2019-08-30T07:05:23.000Z"),
           "status" : "Active"
       }, 
       {
           "_id" : ObjectId("5d3fec39c81f463a257862cf"),
           "planId" : "plan_FVNvCvm7Qg5uYB",
           "startDate" : ISODate("2019-07-30T07:05:23.000Z"),
           "endDate" : ISODate("2019-08-30T07:05:23.000Z"),
           "status" : "Active"
       }, 
       {
           "_id" : ObjectId("5d3fec4bc81f463a257862d2"),
           "planId" : "plan_FVNvrmjWT7fRAS",
           "startDate" : ISODate("2019-07-30T07:05:41.000Z"),
           "endDate" : ISODate("2019-08-30T07:05:41.000Z"),
           "status" : "Active"
       }
     ]
}

应该在单个数据库查询中为匹配的计划 ID 更新开始日期。

最佳答案

我认为最好的办法是使用像这样的 bulkWrite 命令:

db.collection.bulkWrite([
{ updateOne: {
        filter: {
            "subscriptions": {
                "$elemMatch": {
                    "planId": "plan_FVNvrmjWT7fRAS" } } },
        update: {
            "$set": {
                "subscriptions.$.startDate": ISODate("2019-08-02T15:06:06.783Z")
            } } } }, 
{ updateOne: {
        filter: {
            "subscriptions": {
                "$elemMatch": {
                    "planId": "plan_FVNvCvm7Qg5uYB"
                } } },
        update: {
            "$set": {
                "subscriptions.$.startDate": ISODate("2019-08-02T15:06:06.783Z")
            } } } }, 
{ updateOne: {
        filter: {
            "subscriptions": {
                "$elemMatch": {
                    "planId": "plan_FVNvrmjWT7fRDY"
                } } },
        update: {
            "$set": {
                "subscriptions.$.startDate": ISODate("2019-08-02T15:06:06.783Z")
            } } } }])

我无法帮助您处理 js/node 驱动程序/客户端代码,但这里有生成上述命令的 c# 代码,以防有人感兴趣:

using MongoDB.Driver;
using MongoDB.Entities;
using System;

namespace StackOverflow
{
    public class Document : Entity
    {
        public Subscription[] subscriptions { get; set; }
    }

    public class Subscription
    {
        public string planId { get; set; }
        public DateTime startDate { get; set; }
    }

    public class Program
    {
        private static void Main(string[] args)
        {
            new DB("test");

            var data = new[] {
                new Subscription {
                    planId = "plan_FVNvrmjWT7fRDY",
                    startDate = DateTime.UtcNow
                },
                new Subscription {
                    planId = "plan_FVNvCvm7Qg5uYB",
                    startDate = DateTime.UtcNow
                },
                new Subscription {
                    planId = "plan_FVNvrmjWT7fRAS",
                    startDate = DateTime.UtcNow
                }
            };

            var bulk = DB.Update<Document>();

            foreach (var sub in data)
            {
                bulk.Match(b => b.ElemMatch(d => d.subscriptions, s => s.planId == sub.planId))
                    .Modify(b => b.Set(d => d.subscriptions[-1].startDate, sub.startDate))
                    .AddToQueue();

            }

            bulk.Execute();
        }
    }
}

关于javascript - 我有一个 id 数组,需要更新对象文档 mongodb 中数组中的匹配对象,如果没有则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57327224/

相关文章:

javascript - 对象数组的 Mongoose 模式以及更新对象时应添加

mongodb - 匿名用户可以在启用 security.authorization 的情况下连接到 MongoDB

javascript - jQuery 和 xPath 解决方案

javascript - 我的 Promise 实现是否符合规范?

javascript - 如何在 CSS 转换期间阻止处理事件循环中的其他消息?

node.js - 如何将数据引用从一个集合引用到另一个集合? MongoDB

javascript - 异步函数永不返回

javascript - 从移动内存中删除JS文件

json - 设置 package.json 默认值

Mongodb 聚合 - 分钟但不为零