2017-07-12 14 views
0

私はcommonIdに基づいて、私はこのデータをグループ化する形式MongoDB:フィールドの一意の値の数を見つける方法?

{ 
    "_id": "00067223", 
    "commonId": "07dbad91-a32c-46da-b1a2-65faa0031eae", 
    "content": { 
    "loc": { 
     "la": 27.167064, 
     "lo": 78.036441 
    }, 
    "propertyType": "Type", 
    "r": "20087.0", 
    "ta": { 
     "rating": 3.5, 
     "reviews": 42 
    }, 
    "star": 3 
    }, 
    "createdDate": "2017-05-23T10:29:40.681Z" 
} 

を以下にMongoDBの中のデータを持っているとし、フォーマットを以下に結果を取得します。

{ 
    "commonId": "07dbad91-a32c-46da-b1a2-65faa0031eae", 
    "stars" : {"1" : 100, "2" : 200, "3" : 300, "4" : 550 }, 
    "propertyTypes" : {"Type1":4,"Type2":40,"Type3":400}, 
    "taRatings" : {"1.5" : 100, "2.5" : 200, "3.5" : 300, "4.5" : 550 } 

} 

私は$ addToSetを試してみましたが、それは私だけスター/プロパティタイプ/ taRatingの一意の値を与えることができますが、カウント部はまだ問題があります。効率的にどのように解決できますか?

答えて

0

以下の集計クエリを試すことができます。

$group & $sumを一度に1レベルずつ減らし、キー値のペアの配列をオブジェクトに変換します。

var arrayToObject = (array) => array.reduce((acc, curr) => {acc[curr.k] = curr.v; return acc}, {}); 

db.collectionname.aggregate([ 
    { 
    "$group": { 
     "_id": { 
     "commonId": "$commonId", 
     "star": "$content.star", 
     "propertyType": "$content.propertyType", 
     "taRating": "$content.ta.rating" 
     }, 
     "taRatingCount": { 
     "$sum": 1 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": { 
     "commonId": "$_id.commonId", 
     "star": "$_id.star", 
     "propertyType": "$_id.propertyType" 
     }, 
     "taRatings": { 
     "$push": { 
      "k": "$_id.taRating", 
      "v": "$taRatingCount" 
     } 
     }, 
     "propertyTypeCount": { 
     "$sum": 1 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": { 
     "commonId": "$_id.commonId", 
     "star": "$_id.star" 
     }, 
     "taRatings": { 
     "$first": "$taRatings" 
     }, 
     "propertyTypes": { 
     "$push": { 
      "k": "$_id.propertyType", 
      "v": "$propertyTypeCount" 
     } 
     }, 
     "starCount": { 
     "$sum": 1 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": { 
     "commonId": "$_id.commonId" 
     }, 
     "taRatings": { 
     "$first": "$taRatings" 
     }, 
     "propertyTypes": { 
     "$first": "$propertyTypes" 
     }, 
     "stars": { 
     "$push": { 
      "k": "$_id.star", 
      "v": "$starCount" 
     } 
     } 
    } 
    } 
]).map(doc => ({ 
    "_id": doc._id.commonId, 
    "propertyTypes": arrayToObject(doc.propertyTypes), 
    "taRatings": arrayToObject(doc.taRatings), 
    "stars": arrayToObject(doc.stars) 
})); 
+0

Thanks Veeram。私はこのようなグループ分けを行うために少なくとも10のフィールドを持っているので、これは高価すぎるようです。 – Arjit

+0

Np。あなたの期待が何だったか教えていただけますか?なぜこれは高価で、ユースケースは何ですか?あなたはそれを試しましたか? mongoをSQLデータベースではなく使用したいですか? 3フィールドのために – Veeram

+0

、私たちは$グループを4回使用しています。 $グループは当然高価です。私はそれを行うストアドファンクションを評価しています。ストアドファンクションを使用して単一ループで実行できます。 – Arjit

関連する問題