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 中没有通用的方法来实现你想要的,因为如果相同的字段具有不同的类型(例如数组与对象),比较可能会很棘手
尽管如此,您可以通过
$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"
]
]
}
}
}
}
}
}
])
另一方面,您的场景表明您希望捕获同一文档的不同版本之间的更改。在这种情况下,您可能会发现更改流很有用。