Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-如何基于另一个属性检查一个属性的唯一性_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB-如何基于另一个属性检查一个属性的唯一性

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

我试图识别mongo DB中的坏数据,并努力获得正确的聚合。文档如下所示:

{
  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'}}}}])
然后检查这个数组,也许分析它的大小等。你可以通过加入一堆文档进行测试来澄清一下,然后向我们展示该示例的预期聚合输出吗?