繁体   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