簡體   English   中英

MongoDB 跟蹤數據變化

[英]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 的數據庫上,我會建議某種這種解決方案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM