[英]MongoDB Track data changes
我想跟踪 MongoDB 文档的更改。 最大的挑战是 MongoDB 具有嵌套的文档。
[
{
"_id": "60f7a86c0e979362a25245eb",
"email": "walltownsend@delphide.com",
"friends": [
{
"name": "Hancock Nelson"
},
{
"name": "Owen Dotson"
},
{
"name": "Cathy Jarvis"
}
]
}
]
[
{
"_id": "60f7a86c0e979362a25245eb",
"email": "walltownsend@delphide.com",
"friends": [
{
"name": "Daphne Kline" //<------
},
{
"name": "Owen Dotson"
},
{
"name": "Cathy Jarvis"
}
]
}
]
这是高度可扩展的现实世界使用追逐的一个非常基本的例子。
在基于 SQL 的数据库上,我会建议某种这种解决方案。
用户
_ID | 电子邮件 |
---|---|
60f7a8b28db7c78b57bbc217 | cathyjarvis@delphide.com |
朋友们
_ID | 用户身份 | 名称 |
---|---|---|
0 | 60f7a8b28db7c78b57bbc217 | 汉考克·纳尔逊 |
1 | 60f7a8b28db7c78b57bbc217 | 苏亚雷斯·伯特 |
2 | 60f7a8b28db7c78b57bbc217 | 梅佳艾略特 |
用户
_ID | 电子邮件 |
---|---|
60f7a8b28db7c78b57bbc217 | cathyjarvis@delphide.com |
朋友们
_ID | 用户身份 | 名称 |
---|---|---|
0 | 60f7a8b28db7c78b57bbc217 | 达芙妮·克莱恩 |
1 | 60f7a8b28db7c78b57bbc217 | 苏亚雷斯·伯特 |
2 | 60f7a8b28db7c78b57bbc217 | 梅佳艾略特 |
历史
_ID | 朋友 ID | 场地 | 更新前 | 更新后 |
---|---|---|---|---|
0 | 0 | 名称 | 汉考克·纳尔逊 | 达芙妮·克莱恩 |
如果有更新并且必须在下一次更新之前跟踪更改,这也适用于 NoSQL。 如果有第二个更新,我们在 SQL 数据库中有第二行,它不是很清楚。 在 NoSQL 上,您可以制作完整文档的列表/数组并比较索引期间的更改,但是有很多没有更改的冗余信息。
看看设置表达式运算符
$setDifference
$setEquals
$setIntersection
请注意,这些运算符对数组执行集合操作,将数组视为集合。 如果数组包含重复条目,它们将忽略重复条目。 他们忽略元素的顺序。
在您的示例中,更新将导致
removed: [ {name: "Hancock Nelson" } ],
added: [ {name: "Daphne Kline" } ]
如果更新前后元素的数量始终相同,那么您可以使用这个:
db.collection.insertOne({
friends: [
{ "name": "Hancock Nelson" },
{ "name": "Owen Dotson" },
{ "name": "Cathy Jarvis" }
],
updated_friends: [
{ "name": "Daphne Kline" },
{ "name": "Owen Dotson" },
{ "name": "Cathy Jarvis" }
]
})
db.collection.aggregate([
{
$set: {
difference: {
$map: {
input: { $range: [0, { $size: "$friends" }] },
as: "i",
in: {
$cond: {
if: {
$eq: [
{ $arrayElemAt: ["$friends", "$$i"] },
{ $arrayElemAt: ["$updated_friends", "$$i"] }
]
},
then: null,
else: {
old: { $arrayElemAt: ["$friends", "$$i"] },
new: { $arrayElemAt: ["$updated_friends", "$$i"] }
}
}
}
}
}
}
},
{
$set: {
difference: {
$filter: {
input: "$difference",
cond: { $ne: ["$$this", null] }
}
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.