首页 > 解决方案 > 猫鼬批量执行创建,如果不存在,否则更新不包含时间戳

问题描述

编辑: 我知道,setDefaultsOnInsert但我似乎无法弄清楚如何通过该选项...

activity.notify.forEach( user_id => {
    query = { 'notification._id': activity._id, user_id, type: "replied to an idea you're subscribed to" }
    update = { $set: { notification: activity }, $addToSet: { user_details: user_data } }
    options = { setDefaultsOnInsert: true }

    bulk.find( query ).upsert().update( update, options )
} )

目前正在构建一个通知系统。

这是我的代码目前的样子:

let bulk = Notification.collection.initializeUnorderedBulkOp()

activity.notify.forEach( user_id => {
    query = { 'notification._id': activity._id, user_id, type: "replied to an idea you're subscribed to" }
    update = { $set: { notification: activity }, $addToSet: { user_details: user_data } }

    bulk.find( query ).upsert().update( update )
} )

bulk.execute()
    .then( r => console.log( 'r', r ) )
    .catch( err => console.log( 'bulk exec err ', err.writeErrors[ 0 ] ) )

代码的作用是查看一个名为notifycontains的数组user_ids

然后它会查看是否user_id已经存在类似的通知。如果是这样,请将其更新$addToSet为 array user_details


这种方法的问题是它没有时间戳。在我的模型中,我有一条线:timestamps: true但是由于我正在更新一些文档,它们不会通过以下文档的正常实例化:new Notification()

有没有办法自动包含这些,或者我必须创建一些辅助函数来生成createdAtupdatedAt

这对我不起作用

标签: node.jsmongodbmongoose

解决方案


推荐阅读