[英]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.