MongoDB-如何基于另一个属性检查一个属性的唯一性
我试图识别mongo DB中的坏数据,并努力获得正确的聚合。文档如下所示:MongoDB-如何基于另一个属性检查一个属性的唯一性,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我试图识别mongo DB中的坏数据,并努力获得正确的聚合。文档如下所示: { clientCode: 'abc', categoryId: 123, externalCategoryId: 'foo', ... } externalCategoryId是客户端提供的,对于clientCode应该是唯一的,但是对于不同的clientCode可以重复 我试图识别的坏数据是,对于给定的clientCode,是否有两个不同的categoryId具有相同的externalCategor
{
clientCode: 'abc',
categoryId: 123,
externalCategoryId: 'foo',
...
}
externalCategoryId是客户端提供的,对于clientCode应该是唯一的,但是对于不同的clientCode可以重复
我试图识别的坏数据是,对于给定的clientCode,是否有两个不同的categoryId具有相同的externalCategoryId
这不需要是高效的,也不需要在应用程序中运行,现在只需要一次查询来检查数据的完整性
我尝试了以下文档和其他关于聚合/求和的建议,但还没有得到。我一直在走我自己的路
{
clientCode: 'abc',
externalCategoryId: 'foo',
numCategoryIds: 2
}
但我也愿意接受其他建议
我一直在改进尝试,所以我以前没有现成的尝试。这是当前形式的查询:
db.getCollection('funds').aggregate([
{ $group: {
_id: { clientCode: '$clientCode', externalCategoryId: '$externalCategoryId', categoryId: '$categoryId' }
}},
{ $group: {
_id: { clientCode: '$_id.clientCode', externalCategoryId: '$_id.externalCategoryId' },
categoryIds: { $sum: 1 }
}}
])
样本文件:
{ clientCode: "abc", categoryId: 1, externalCategoryId: "foo" }
{ clientCode: "xyz", categoryId: 2, externalCategoryId: "foo" }
{ clientCode: "abc", categoryId: 3, externalCategoryId: "bar" }
{ clientCode: "abc", categoryId: 4, externalCategoryId: "foo" }
预期的汇总将是:
{ clientCode: "abc", externalCategoryId: "foo", numberCategoryIds: 2 }
{ clientCode: "abc", externalCategoryId: "bar", numberCategoryIds: 1 }
{ clientCode: "xyz", externalCategoryId: "foo", numberCategoryIds: 1 }
您可以尝试运行以下聚合管道:
db.funds.aggregate([
{
"$group": {
"_id": {
"clientCode": "$clientCode",
"externalCategoryId": "$externalCategoryId"
},
"categoryIds": { "$push": "$categoryId" }
}
},
{
"$project": {
"_id": 0,
"clientCode": "$_id.clientCode",
"externalCategoryId": "$_id.externalCategoryId",
"numberCategoryIds": { "$size": "$categoryIds" }
}
}
])
样本输出
/* 1 */
{
"clientCode" : "abc",
"externalCategoryId" : "foo",
"numberCategoryIds" : 2
}
/* 2 */
{
"clientCode" : "xyz",
"externalCategoryId" : "foo",
"numberCategoryIds" : 1
}
/* 3 */
{
"clientCode" : "abc",
"externalCategoryId" : "bar",
"numberCategoryIds" : 1
}
你能回答你的问题以显示你尝试过的聚合查询吗?添加了当前正在进行的工作查询,但我没有保存过去的迭代。我不太确定我是否很好地理解了你的问题,尤其是在你说的地方externalCategoryId是客户端提供的,对于clientCode应该是唯一的,但是对于不同的clientCode可以重复“但我相信你正朝着正确的方向前进。您可能需要做的是创建一个管道步骤,通过
clientCode
和externalCategoryId
字段对文档进行分组,然后使用$push
创建一系列categoryId
如下db.getCollection('funds')。聚合([{$group:{id:{clientCode:'$clientCode',externalCategoryId:'$externalCategoryId'},categoryId:{“$push:'$categoryId'}}}}])
然后检查这个数组,也许分析它的大小等。你可以通过加入一堆文档进行测试来澄清一下,然后向我们展示该示例的预期聚合输出吗?