MongoDB在bulkWrite()上更改流

时间:2018-11-04 18:33:25

标签: mongodb

我处于经常更改一个文档的情况。我有几个更新,这些更新是通过 bulkWrite()发送的。我想限制基于 bulkWrite()的更改流中的通知数量。如果我对文档进行5x更新,则更改流将通知5x。在完成所有 bulkWrite()之后,在所有这些更新之后仅收到一个通知将是很好的。有没有办法实现这一目标?

2 个答案:

答案 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" : {

    }
}

如果我能做其他事情,请随时问:)。