【问题标题】:MongoDB Atlas trigger does not set fieldMongoDB Atlas 触发器未设置字段
【发布时间】:2020-04-23 18:51:37
【问题描述】:

我有以下触发功能,但不是功能。我想知道为什么它没有设置字段 createdAt:

const collection = context.services.get("comand-dev").db("test").collection("ownerDetails");
  const docId = changeEvent.documentKey._id;
  collection;
  collection.updateOne(
    {_id : docId} ,
    { 
      $set : 
        {
        createdAt: Date()
        } 
    }
  );

触发器日志显示正常,但该字段不存在

【问题讨论】:

  • 集合中是否有 _id 为 docId 的文档?
  • 我想是这样,我该如何调试?触发器是在每个 insert 上创建的,所以此时可能还没有创建 _id?触发器是在实际插入之前还是之后运行?
  • 什么是changeEvent,它来自哪里?
  • changeEvent 来自触发器本身。请看docs.mongodb.com/manual/reference/change-events/#insert-event。似乎 _id 存在所以这不是我的触发器的问题
  • 1) 触发器类型是什么? 2) 检查触发器是否启用 3) 触发器申请什么操作类型? 4)检查它是否用于正确的服务名称,即'command-dev' 5)检查它是否用于正确的数据库/集合。

标签: mongodb mongodb-atlas


【解决方案1】:

这对我有用。语法的一个小问题。您必须添加引号。

collection.updateOne(
{"_id" : docId} ,
    { 
      "$set" : 
        {
        "createdat": Date()
        } 
    }
);

【讨论】:

    【解决方案2】:

    我能够弄清楚,所以我会分享我的解决方案。就我而言,我将 _id 对象 id 转换为日期并将其作为新插入文档的新字段插入。触发器将被配置为插入触发器操作。启用事件排序。

     exports = function (changeEvent) {
     const docId = changeEvent.documentKey._id;
     console.log(docId);
     const collection = 
     context.services.get("Cluster0").db("Driver").collection("Trip");
     collection.updateOne({_id: docId },
     [{
        "$addFields" : {
            "CreationDate" : {
                "$toDate" : "$_id"
            }
        }
    }],{upsert: false}
    );
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2022-01-23
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多