如何更新mongo上的许多文档并返回更新后的文档



如何在mongoose上更新许多文档并返回这些更新的文档,以便将更新的文档传递给代码上的其他服务?这看起来很简单,但我对如何实现感到困惑

在我当前的代码中,我只是用updateMany批量更新文档,但正如mongo文档所说,返回的writeConcern只是更新了{n: 0 }的文档数,而不是实际文档。

当前代码:

const checkAndUpdateSubscription = () => {
const filter = {
"payments.0.stripeSubscriptionEndDate": { $lte: today },
hasPaid: true,
};
const update = { $set: { hasPaid: false, isSubscriptionNew: 0 } };
const options = { new: true, useFindAndModify: false };
return new Promise((resolve, reject) => {
ModelModel.updateMany(filter, update, options)
.then((response) => {
console.log('response inside checkAndUpdateSubscription', response)
resolve(response);
})
.catch((error) => {
reject(error);
});
});
};

我想把它改成类似下面的伪代码。

我想做什么:

const checkAndUpdateSubscription = () => {
const filter = {
"payments.0.stripeSubscriptionEndDate": { $lte: today },
hasPaid: true,
};
const update = { $set: { hasPaid: false, isSubscriptionNew: 0 } };
const options = { new: true, useFindAndModify: false };
return new Promise((resolve, reject) => {
// 1. ModelModel.find where stripeSubscriptionEndDate $lte than today ..etc
// 2. Update the document(s) 
// 3. Return the updated document(s)
(//4.) .then(updatedModel => sendUpdateModelToOutsideService(updatedModel))
});
};

我不知道这在这个问题的上下文中是否有必要,但checkAndUpdateSubscription方法是一个函数,它在我的数据库中每1分钟运行一次,用于我的所有用户(#~数千)

您可以将其作为替代解决方案
(也许有更简单的方法,但我认为这些方法会起作用)

查找ID

  • 查找以获取这些ID
    ids = find(your_filter,project_keep_id_only),然后生成ids=[_id1, _id2 ...] an array of the ids
  • 使用筛选器_id$inid更新
    update({"_id" : {"$in" : ids}},your_update_set_etc)
  • 查找以获取更新的文档
    docs=find({"_id" : {"$in" : ids}})

*如果id不太多,我认为会很好

用额外字段标记更新

  • 在更新集上增加了一个字段update_id
  • 更新后,根据updateid进行查找,以获取文档
  • 如果你想在

如果并行运行,那么这个额外的字段可能是一个数组,其中有许多update_id,您可以在取回这些文档后删除它们。

相关内容

  • 没有找到相关文章

最新更新