【问题标题】:add field to all documents in mongodb collection向 mongodb 集合中的所有文档添加字段
【发布时间】:2021-06-04 15:21:24
【问题描述】:

我正在处理节点 js 项目,我有一个 mongodb 订单集合,我想在其中向每个文档添加一个字段,问题是我想传递一个函数作为这个新字段的值和参数该函数是文档的另外两个字段,这是一个示例,可以让您理解。 我的收藏:

[
 {  
 _id:"eyxwapfhiezfe664ec",
 orderPrice : 20,
 createdAt :  2021-01-15T17:16:25.844Z
 endedAt : 2021-01-15T17:20:25.844Z
 
}
{
 _id:"eyxwlcfeojrfeoc",
  orderPrice : 50,
  createdAt :  2021-01-15T17:16:25.844Z
  endedAt : 2021-01-15T17:20:25.844Z
 
}
{
  _id:"eyxwapfhiseflflpsssc",
  orderPrice : 20, 
  createdAt :  2021-01-15T17:16:25.844Z
  endedAt : 2021-01-15T17:20:25.844Z
}

我要添加的字段是 completedTime,它是 createdAt 和endedAt 之间的差异我有一个函数 differenceBetweenDates 它接受两个日期作为参数 createdAt 并结束于但我不知道如何在更新中将此函数传递给 $set . 所以为了更清楚,我想将此字段添加到每个文档中:

CompletedTime: differenceBetweenDates(createdAt, endedAt)

谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果您使用的是 MongoDB 4.2,则可以将聚合表达式作为 update 的一部分传递。

    db.collection.updateMany({},[{ $set:{ CompletedTime: {$subtract:["$endedAt", "$createdAt" ]}}}])
    

    在 MongoDB 4.4 中,您还可以使用带有 $merge 阶段的聚合管道将结果集合并回原始集合:

    db.collection.aggregate([
      { $set: { CompletedTime: {$subtract:["$endedAt", "$createdAt" ]}}},
      { $merge: "collection" }
    ])
    

    【讨论】:

    • 我不认为 $substract 会给我正确的结果,因为我的函数 differenceBetweenTwoDates 给了我小时的差异我不知道这是否可以用 $substract
    • 减法会给你以毫秒为单位的差异,如果你需要以小时为单位,则除以 3600000。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2021-08-19
    相关资源
    最近更新 更多