我处于经常更改一个文档的情况。我有几个更新,这些更新是通过 bulkWrite()发送的。我想限制基于 bulkWrite()的更改流中的通知数量。如果我对文档进行5x更新,则更改流将通知5x。在完成所有 bulkWrite()之后,在所有这些更新之后仅收到一个通知将是很好的。有没有办法实现这一目标?
答案 0 :(得分:1)
我的处境不同,但与您相似。 当用户更改表单中的字段时,我正在更新文档,但是在流中,我只想听最终的更新文档。
我的解决方法是防抖。
总体思路是存储流的唯一表示形式(集合,操作和文档的组合),然后在使用该流之前先超时。如果另一个流具有相同的唯一ID表示形式,则您可以取消上一个超时并创建一个新的超时。
这是update
操作的简单示例:
const streamMap = new Map();
const debounceStreamExecution = (next, fn) => {
const streamId = `${next.operationType}_${next.documentKey._id.toString()}` // This could be your own unique representation of a stream.
const streamItem = streamMap.get(streamId);
if (streamItem && streamItem.timeout) {
// Same stream came before, so stop previous execution.
clearTimeout(streamItem.timeout);
}
// We merge previous updates with new ones
const updateDescription = {
updatedFields: {
// Use Lodash _.merge() if you want deep merging
...streamItem.updateDescription.updatedFields || {},
...next.updateDescription.updatedFields || {}
},
removedFields: [].concat(
streamItem.updateDescription.removedFields || [],
next.updateDescription.removedFields || []
)
};
// We set our timeout to delay execution
const timeout = setTimeout(() => {
streamMap.delete(streamId);
fn({
...next,
updateDescription
});
}, 1000 /* <-- Your delay preference */);
// We store this stream information.
streamMap.set(streamId, {
updateDescription,
timeout
});
};
db.collection('aCollection').watch().on('change', next => {
debounceStreamExecution(next, (result) => {
console.log('Single stream', result);
});
});
答案 1 :(得分:0)
请查看MongoDB文档https://docs.mongodb.com/manual/core/bulk-write-operations/#bulkwrite-methods
如果您尝试执行以下操作:
db.collectionName.bulkWrite(
[
{ insertOne :
{
"document" :
{
"char" : "Dithras", "class" : "barbarian", "lvl" : 4
}
}
},
{ insertOne :
{
"document" :
{
"char" : "Taeln", "class" : "fighter", "lvl" : 3
}
}
},
{ updateOne :
{
"filter" : { "char" : "Taeln" },
"update" : { $set : { "status" : "Critical Injury" } }
}
},
{ deleteOne :
{ "filter" : { "char" : "Brisbane"} }
},
{ replaceOne :
{
"filter" : { "char" : "Meldane" },
"replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
}
}
]
);
您只会得到一个结果
{
"acknowledged" : true,
"deletedCount" : 0,
"insertedCount" : 2,
"matchedCount" : 1,
"upsertedCount" : 0,
"insertedIds" : {
"0" : ObjectId("5bdfe0a5bad3d851a4064080"),
"1" : ObjectId("5bdfe0a5bad3d851a4064081")
},
"upsertedIds" : {
}
}
如果我能做其他事情,请随时问:)。