如何在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
$in
id更新update({"_id" : {"$in" : ids}},your_update_set_etc)
- 查找以获取更新的文档
docs=find({"_id" : {"$in" : ids}})
*如果id不太多,我认为会很好
用额外字段标记更新
- 在更新集上增加了一个字段update_id
- 更新后,根据updateid进行查找,以获取文档
- 如果你想在
如果并行运行,那么这个额外的字段可能是一个数组,其中有许多update_id,您可以在取回这些文档后删除它们。