MongoDB 功能或查询来比较两个文档

问题描述 投票:0回答:1

MongoDB 是否有功能或查询来比较两个文档并获取具有不同值的属性?

以下是我正在尝试实现的实际场景。

示例文档1(版本1)

{
  "firstName": "Rack's",
  "lastName": "Jackon",
  "gender": "man",
  "age": 24,
  "address": {
    "streetAddress": "126",
    "city": "San Jone",
    "state": "CA",
    "postalCode": "394221"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "7383627627"
    }
  ]
}

示例文档 2(版本 2)

{
  "firstName": "Rack's",
  "lastName": "Mathew",
  "gender": "man",
  "age": 28,
  "address": {
    "streetAddress": "126",
    "city": "San Jone",
    "state": "CA",
    "postalCode": "394221"
  },
  "phoneNumbers": [
    {
      "type": "Work",
      "number": "7383627888"
    }
  ]
}

在上面的示例 JSON 中,只有 4 个不同的属性,因此想要获取具有不同值的属性/仅属性名称也可以。

预期产出

物业名称 文件1 文件2
姓氏 杰克逊 马修
年龄 24 28
phoneNumbers.type 工作
电话号码.号码 7383627627 7383627888

我们是否有任何特定的查询或内置功能可以提供帮助。

一种方法是从 MongoDB 获取记录并将其与集成技术(在我的例子中为.NET)进行比较,但只想在 MongoDB 端进行。

任何建议都有帮助,提前致谢。

能够通过检索记录并比较来获得提到的预期输出。

mongodb mongodb-query
1个回答
0
投票

我认为 MongoDB 中没有通用的方法来实现你想要的,因为如果相同的字段具有不同的类型(例如数组与对象),比较可能会很棘手

尽管如此,您可以通过

$objectToArray
将两个文档放入kv元组数组中并执行
$setDifference
来找出差异来部分实现差异。

db.collection.aggregate([
  {
    "$match": {
      "id": "uniqueId",
      "ver": 0
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "id",
      "foreignField": "id",
      let: {
        oldVer: "$ver"
      },
      pipeline: [
        {
          "$match": {
            $expr: {
              $ne: [
                "$ver",
                "$$oldVer"
              ]
            }
          }
        },
        {
          $sort: {
            ver: -1
          }
        },
        {
          $limit: 1
        }
      ],
      "as": "newVersion"
    }
  },
  {
    "$unwind": "$newVersion"
  },
  {
    "$project": {
      old: {
        "$objectToArray": "$$ROOT"
      },
      new: {
        "$objectToArray": "$newVersion"
      }
    }
  },
  {
    "$project": {
      diff: {
        "$filter": {
          "input": {
            "$setDifference": [
              "$old",
              "$new"
            ]
          },
          "as": "diffEntry",
          "cond": {
            $not: {
              $in: [
                "$$diffEntry.k",
                [
                  "newVersion",
                  "ver",
                  "_id"
                ]
              ]
            }
          }
        }
      }
    }
  }
])

蒙戈游乐场


另一方面,您的场景表明您希望捕获同一文档的不同版本之间的更改。在这种情况下,您可能会发现更改流很有用。

© www.soinside.com 2019 - 2024. All rights reserved.