关于更新更改事件的mongo文档说更新描述将包含一个删除字段的数组、一个更新字段的文档和一个截断数组的数组。删除和更新的字段非常直接,但是我很难理解截断的数组是什么。
文档说
记录数组截断的文档数组基于管道的更新使用以下一个或多个阶段:
addFields美元
- 元组
replaceRoot美元replaceWith美元
但是,尽管我尝试了,我似乎无法弄清楚如何导致包含截断数组的更新事件。
任何帮助理解这个字段的作用和/或如何导致包含它的更新的示例,将不胜感激。
我不知道更改流文档有truncatedArrays字段。因此,我试图在MongoDB版本4和5中设置更改流。
MongoDB Enterprise rs0:PRIMARY> db.coll.find();
{ "_id" : ObjectId("63b2d783"), "a" : 1, "b" : [ { "c" : 1, "d" : "qwq" }, { "c" : 2, "d" : "mlo" } ] }
{ "_id" : ObjectId("63b2d784"), "a" : 2, "b" : [ { "c" : 4, "d" : "hyt" }, { "c" : 5, "d" : "nhw" } ] }
在另一个窗口中
MongoDB Enterprise rs0:PRIMARY> cs = db.coll.watch([], {"fullDocument": "updateLookup"});
MongoDB Enterprise rs0:PRIMARY> while(!cs.isExhausted()){
... if(cs.hasNext()){
... print(tojson(cs.next()));
... }
... }
然后我运行了一个更新。
MongoDB Enterprise rs0:PRIMARY> db.coll.update({},{$set:{"a":3}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更改流中没有此字段。
{
"_id" : {"_data" : "8263B2D474000000012B022C0100296E5A100439C39"},
"operationType" : "update",
"clusterTime" : Timestamp(1672664180, 1),
"fullDocument" : {
"_id" : ObjectId("63b2d783"),
"a" : 3,
"b" : [
{"c" : 1,"d" : "qwq"},
{"c" : 2,"d" : "mlo"}
]
},
"ns" : {
"db" : "test","coll" : "coll"
},
"documentKey" : {"_id" : ObjectId("63b2d783")},
"updateDescription" : {
"updatedFields" : {
"a" : 3
},
"removedFields" : [ ]
}
}
接下来,我将服务器更新为版本6并执行这个更新查询来切片数组。
db.coll.update(
{},
[
{$set: {"b": {$slice: ["$b",1]}}}
]
);
结果就是这样。显示数组字段名和它的新大小。
{
"_id" : {"_data" : "8263B2D756000000012B022C0100296E5A1004A7FD82"},
"operationType" : "update",
"clusterTime" : Timestamp(1672664918, 1),
"wallTime" : ISODate("2023-01-02T13:08:38.584Z"),
"fullDocument" : {
"_id" : ObjectId("63b2d1d6"),
"a" : 1,
"b" : [
{"c" : 1,"d" : "qwq"}
]
},
"ns" : {
"db" : "test","coll" : "coll"
},
"documentKey" : {"_id" : ObjectId("63b2d1d6")},
"updateDescription" : {
"updatedFields" : {
},
"removedFields" : [ ],
"truncatedArrays" : [
{
"field" : "b",
"newSize" : 1
}
]
}
}
我无法找到任何其他方法使用$replaceRoot/$replaceWith。