gpt4 book ai didi

MongoDB更改流仅显示选定字段

转载 作者:行者123 更新时间:2023-12-04 01:58:16 24 4
gpt4 key购买 nike

我正在尝试了解 MongoDB 中的更改流。

我试图仅显示更新文档的某些字段。

所以我做了:

option={ 'full_document':'updateLookup' }
collection.watch([{"$match" : { "operationType" : "update" }}] , **option)

这是工作。

现在我只想显示一些字段。

我试过:
collection.watch([{"$match"  : { "operationType" : "update" }},{"$project":{"_id":1}}] , **option)

或者
collection.watch([{"$match"  : { "operationType" : "update" }}],option).aggregate({"$project":{"_id":1}})

但它们都不起作用。

如何仅显示选定的字段?

最佳答案

来自 Change Event documentation page ,更改流将输出此文档:

{
_id : { <BSON Object> },
"operationType" : "<operation>",
"fullDocument" : { <document> },
"ns" : {
"db" : "<database>",
"coll" : "<collection"
},
"documentKey" : { "_id" : <ObjectId> },
"updateDescription" : {
"updatedFields" : { <document> },
"removedFields" : [ "<field>", ... ]
}
}

也就是说,如果您在 watch() 中什么都不放,该文档将成为输出。方法。

然后您可以使用 aggregation pipeline stages过滤/修改此文档。

例如,如果您只想查看字段 _id , a , 和 b从插入/更新的文档中,管道将是(使用 Python):
with db.test.watch([
{'$project': {
'fullDocument_id':'$fullDocument._id',
'a':'$fullDocument.a',
'b':'$fullDocument.b'}}], full_document='updateLookup') as stream:
for change in stream:
print change

将数据插入 MongoDB:
> db.test.insert({a:1, b:1, c:1, d:1})

更改流将输出:
{'a': 1.0,
'fullDocument_id': ObjectId('5aa0c2300551e941c6958f86'),
'_id': <BSON object>,
'b': 1.0}

备注 : 我投影了插入文档的 _id进入 fullDocument_id .您可以将其投影到 _id (例如 _id: '$fullDocument._id' ),但您将丢失更改流的原始 _id字段,其中包含 resume token .

备注 : 我也用过参数 full_document='updateLookup'创建流时。否则,完整的文档将不会显示在 update 中。事件。这在 Change Event page 中有解释

备注 :上面的示例用于插入文档,但您可以使用 $match: {operationType: 'update'} 轻松定制它以进行更新前阶段 $project阶段。

备注 : fullDocument更新事件返回的字段包含多数提交给副本集成员的文档的查找版本。这可能是也可能不是被修改的文档版本。更新操作和更改流返回到客户端之间的任何其他交错操作都可能更改了文档的版本。例如,删除事件可能会导致 fullDocument字段为 null .见 Lookup Full Document for Update Operations更多细节。

关于MongoDB更改流仅显示选定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49153312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com