2016-10-17 2 views
1

私はmongo DBの不良データを特定し、集約権を取得しようとしています。文書は、次のようになります。MongoDB - 別のプロパティに基づいてあるプロパティの一意性をチェックする方法

{ 
    clientCode: 'abc', 
    categoryId: 123, 
    externalCategoryId: 'foo', 
    ... 
} 

externalCategoryIdは、クライアントが供給され、clientCodeのためのユニークでなければなりませんが、異なるclientCodeのために複製することができます。

私が識別しようとしている悪いデータは、指定されたclientCodeに対して同じexternalCategoryIdを持つ2つの異なるcategoryIdがあるかどうかです。

これは効率的である必要はなく、アプリケーションで実行する必要はありません。データの正当性を今すぐ確認するための1回限りのクエリです。

私は以下のドキュメントや集計/集計のための他の提案を試みましたが、まだそれを得ることはできませんでした。私は道路の下に行ってきた

{ 
    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 } 
+0

することができます[編集]あなたは試してみました集約クエリを表示するには、あなたの質問? – chridam

+1

現在進行中の作業のクエリを追加しましたが、過去の反復を保存していません。 –

+0

あなたの質問がうまくキャッチされていないかどうかわかりません_ "externalCategoryIdはクライアントが提供しているもので、clientCodeでは一意である必要がありますが、別のclientCodeで複製できます" _ – chridam

答えて

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 
} 
+1

これは完璧に見えます、ありがとうございます。 –

関連する問題