programing

MongoDB 집계:고유 필드 카운트

javaba 2023. 5. 29. 21:43
반응형

MongoDB 집계:고유 필드 카운트

저는 여러 결제처를 사용하는 계정을 식별하기 위해 집계를 작성하려고 합니다.일반적인 데이터는 다음과 같습니다.

{
 account:"abc",
 vendor:"amazon",
}
 ...
{
 account:"abc",
 vendor:"overstock",
}

이제 이와 유사한 계정 목록을 작성하려고 합니다.

{
 account:"abc",
 vendorCount:2
}

이것을 Mongo의 집계 프레임워크에서 어떻게 쓰겠습니까?

저는 $addToSet과 $unwind 연산자를 사용하여 이를 파악했습니다.

Mongodb 집계 수 배열/설정 크기

db.collection.aggregate([
{
    $group: { _id: { account: '$account' }, vendors: { $addToSet: '$vendor'} }
},
{
    $unwind:"$vendors"
},
{
    $group: { _id: "$_id", vendorCount: { $sum:1} }
}
]);

누군가에게 도움이 되길 바랍니다.

저는 당신이 긴장을 풀지 않는 다음과 같은 쿼리를 실행하는 것이 더 좋다고 생각합니다.

db.t2.insert({_id:1,account:"abc",vendor:"amazon"});
db.t2.insert({_id:2,account:"abc",vendor:"overstock"});


db.t2.aggregate([
{ $group : { _id : { "account" : "$account", "vendor" : "$vendor" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.account", number : { $sum : 1 } } }
]);

다음과 같은 결과가 예상됩니다.

{ "_id" : "abc", "number" : 2 }

사용할 수 있습니다.sets

db.test.aggregate([
    {$group: { 
      _id: "$account", 
      uniqueVendors: {$addToSet: "$vendor"}
    }},
    {$project: {
      _id: 1, 
      vendorsCount: {$size: "$uniqueVendors"}
    }}
]);

나는 누군가가 왜 사용해야 하는지 모르겠어요.$group두번이라.

db.collection.aggregate([ { $group: { "_id": "$account", "number": { $sum: 1 } } } ])

이 접근 방식은 $unwind 및 기타 추가 작업을 사용하지 않습니다.또한 집계에 새로운 항목을 추가해도 아무런 영향을 미치지 않습니다.받아들여진 답변에 흠이 있습니다.$group에 누적된 다른 필드가 있으면 승인된 답변의 $unwind 단계에서 문제가 발생합니다.

db.collection.aggregate([{
    "$group": {
        "_id": "$account",
        "vendors": {"$addToSet": "$vendor"}
    }
},
{
    "$addFields": {
        "vendorCount": {
            "$size": "$vendors"
        }
    }
}])

여러 결제 소스를 사용하는 계정 식별하기

  1. 그룹화를 사용하여 여러 계정 레코드의 데이터를 카운트하고 카운트가 있는 계정별로 결과를 그룹화합니다.
  2. 일치 사례 사용은 둘 이상의 결제 방법을 가진 계정만 필터링하는 것입니다.
  db.payment_collection.aggregate([ { $group: {"_id":"$account" ,
 "number":{$sum:1}} }, {
                     "$match": {
                         "number": { "$gt": 1 }
                      }
                 } ])

이건 완벽하게 잘 될 겁니다

db.UserModule.aggregate(
{ $group : { _id : { "companyauthemail" : "$companyauthemail", "email" : "$email" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.companyauthemail", number : { $sum : 1 } } }
);

예문

db.collection.distinct("example.item").forEach( function(docs) {
    print(docs + "==>>" + db.collection.count({"example.item":docs}))
});

언급URL : https://stackoverflow.com/questions/18501064/mongodb-aggregation-counting-distinct-fields

반응형