복붙노트

[MONGODB] 필드를 유지하는 방법 몽고 그룹 쿼리

MONGODB

필드를 유지하는 방법 몽고 그룹 쿼리

각자 모두. 몽고 그룹 쿼리에서 인수의 결과만을 도시 키 (들). MySQL의 쿼리 그룹 등 각 그룹의 첫 번째 문서를 보관하는 방법. 예를 들어 :

-------------------------------------------------------------------------
|  name  | age  |  sex  | province |   city   |   area   |   address     |
-------------------------------------------------------------------------
| ddl1st | 22   | 纯爷们 |  BeiJing |  BeiJing | ChaoYang | QingNianLu    |
| ddl1st | 24   | 纯爷们 |  BeiJing |  BeiJing | XuHui    | ZhaoJiaBangLu |
|  24k   | 220  | ...   |  ....    |  ...     | ...      | ...           |
-------------------------------------------------------------------------



db.users.group({key: { name: 1},reduce: function ( curr, result ) { result.count ++ },initial: {count : 0 } })

결과:

[
{
    "name" : "ddl1st",
    "count" : 1
},
{
    "name" : "24k",
    "count" : 1
}
]

어떻게 다음을 얻을 수 있습니다 :

[
   {
   "name" : "ddl1st",
   "age" : 22,
   "sex" : "纯爷们",
   "province" : "BeiJing",
   "city" : "BeiJing",
   "area" : "ChaoYang",
   "address" : "QingNianLu",
   "count" : 1
   },
   {
   "name" : "24k",
   "age" : 220,
   "sex" : "...",
   "province" : "...",
   "city" : "...",
   "area" : "...",
   "address" : "...",
   "count" : 1
}
]

해결법

  1. ==============================

    1.각 그룹의 첫 번째 일치 항목에 대한 정보를 유지하려는 경우, 당신은 같은 집계 시도 할 수 있습니다 :

    각 그룹의 첫 번째 일치 항목에 대한 정보를 유지하려는 경우, 당신은 같은 집계 시도 할 수 있습니다 :

    db.test.aggregate({
      $group: {
        _id: '$name',
       name : { $first: '$name' }
       age : { $first: '$age' },
       sex : { $first: '$sex' },
       province : { $first: '$province' },
       city : { $first: '$city' },
       area : { $first: '$area' },
       address : { $first: '$address' },
       count: { $sum: 1 }
      }
    }
    
  2. ==============================

    2.만을 먼저 문서를 유지하려는 경우 그건 그렇고, 당신은 $ addToSet을 사용할 수 있습니다 예를 들면 :

    만을 먼저 문서를 유지하려는 경우 그건 그렇고, 당신은 $ addToSet을 사용할 수 있습니다 예를 들면 :

    db.test.aggregate({
      $group: {
        _id: '$name',
        name : { $addToSet: '$name' }
        age : { $addToSet: '$age' },
        count: { $sum: 1 }
      }
    }
    
  3. ==============================

    3.이 작업을 시도 할 수

    이 작업을 시도 할 수

    db.test.aggregate({
          { $group: 
                { _id: '$name',count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
          {
            $project: {
              _id:0,
              data:1,
              count :1
            }
          }
    
    }
    
  4. ==============================

    4.나는 대답을 찾고 여기에 들어 왔지만 (특히 그것의 나이에 주어진) 선택한 답변에 만족하지 않았다. 나는 더 나은 솔루션 (적응)는이 해답을 발견 :

    나는 대답을 찾고 여기에 들어 왔지만 (특히 그것의 나이에 주어진) 선택한 답변에 만족하지 않았다. 나는 더 나은 솔루션 (적응)는이 해답을 발견 :

    db.test.aggregate({
      $group: {
        _id: '$name',
       person: { "$first": "$$ROOT" },
       count: { $sum: 1 }
      },
      {
        "$replaceRoot": { "newRoot": "$person" }
      }
    }
    
  5. ==============================

    5.이것은 내가 그것을 잘 작동 한 것입니다.

    이것은 내가 그것을 잘 작동 한 것입니다.

    db.person.aggregate([
    {
      $group: { _id: '$name'}, // pass the set of field to be grouped
       age : { $first: '$age' }, // retain remaining field
       count: { $sum: 1 } // count based on your group
    },
    {
      $project:{
           name:"$_id.name",
           age: "$age",
           count: "$count",
           _id:0 
      }
    }])
    
  6. ==============================

    6.나는 .group 도우미에 대해 알고하지 않았다,하지만 당신은 집계 프레임 워크로 이동하고 싶은 경우에, 당신은 반환 할 필드를 지정해야합니다. 만약 내가 틀렸다면 정정 해줘,하지만 SQL에서 당신은 어쨌든해야 할 것입니다.

    나는 .group 도우미에 대해 알고하지 않았다,하지만 당신은 집계 프레임 워크로 이동하고 싶은 경우에, 당신은 반환 할 필드를 지정해야합니다. 만약 내가 틀렸다면 정정 해줘,하지만 SQL에서 당신은 어쨌든해야 할 것입니다.

    음, 이것은 당신이 집계 프레임 워크는 전에 언급에 어떻게 할 것입니다 :

    db.test.aggregate({
      $group: {
        _id: { name: "$name", city: "$city", fieldName: "$fieldName" },
        count: { $sum: 1 }
      }
    })
    
  7. ==============================

    7.나는 ... 언 와인드 단계를 반대로 일반화 너희들이 어떤 버그가 발생하면 알려이 기능을 만들었지 만 그것은 나를 위해 잘 작동하고!

    나는 ... 언 와인드 단계를 반대로 일반화 너희들이 어떤 버그가 발생하면 알려이 기능을 만들었지 만 그것은 나를 위해 잘 작동하고!

    const createReverseUnwindStages = unwoundField => {
      const stages = [
        //
        // Group by the unwound field, pushing each unwound value into an array,
        //
        // Store the data from the first unwound document
        // (which should all be the same apart from the unwound field)
        // on a field called data.
        // This is important, since otherwise we have to specify every field we want to keep individually.
        //
        {
          $group: {
            _id: '$_id',
            data: {$first: '$$ROOT'},
            [unwoundField]: {$push: `$${unwoundField}`},
          },
        },
    
        //
        // Copy the array of unwound fields resulting from the group into the data object,
        // overwriting the singular unwound value
        //
        {
          $addFields: {[`data.${unwoundField}`]: `$${unwoundField}`},
        },
    
        //
        // Replace the root with our data object
        //
        {
          $replaceRoot: {
            newRoot: '$data',
          },
        },
      ]
    
      return stages
    }
    
  8. ==============================

    8.여기에 대답은 >>>>

    여기에 대답은 >>>>

        $m = new \MongoDB\Driver\Manager();
    
        $command = new \MongoDB\Driver\Command([
            'aggregate' => 'mytestusers',
            'pipeline' => [
                ['$match' => ['name' => 'Pankaj Choudhary']],
    
                ['$unwind'=>'$skills'],
                ['$lookup' => array('from'=>'mytestskills','localField'=>'skills','foreignField'=>'_id','as'=>'sdfg')],
                ['$unwind'=>'$sdfg'],
    
                ['$group'=>array('_id'=>array('_id'=>'$_id','name'=>'$name','email'=>'$email'),'skills'=>array('$push'=>'$skills'),'sdfg'=>array('$push'=>'$sdfg'))],
    
    
            ],
            'cursor' => new \stdClass,
        ]);
        $cursor = $m->executeCommand('targetjob-plus', $command);
        $result = $cursor->toArray();
    
  9. from https://stackoverflow.com/questions/16662405/mongo-group-query-how-to-keep-fields by cc-by-sa and MIT license