ক্ষেত্রগুলি কীভাবে রাখবেন তা মঙ্গো গ্রুপের জিজ্ঞাসা


97

সবাই। মঙ্গো গ্রুপ কোয়েরিতে, ফলাফলটি কেবল যুক্তিগুলিতে কী (গুলি) দেখায়। মাইএসকিএল কোয়েরি গ্রুপের মতো প্রতিটি গ্রুপে প্রথম ডকুমেন্ট কীভাবে রাখা যায়। উদাহরণ স্বরূপ:

-------------------------------------------------------------------------
|  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
}
]

উত্তর:


215

আপনি যদি প্রতিটি গ্রুপের জন্য প্রথম মিলের এন্ট্রি সম্পর্কিত তথ্য রাখতে চান তবে আপনি এই জাতীয়করণের চেষ্টা করতে পারেন:

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

4
তোমার দরকার কেন {$first: '$age'}? এটা কি সম্ভব age: $age?
হালকা চশমাবিদ

7
@ আলোকশেমিস্ট এটি সম্ভব নয়। 'গোষ্ঠী' কে কী চয়ন করতে হবে তা জানার কৌশল এটি of
টেকউইসডম

4
যদি এই সমষ্টিটি গণনার পরিবর্তে বয়সের জন্য $ সর্বাধিক বা এক মিনিট করছে? প্রথম ক্ষেত্রটি অন্য ক্ষেত্রগুলির জন্য প্রাপ্ত সর্বনিম্ন বা সর্বোচ্চ বয়সের সাথে মেলে না। তাহলে কীভাবে মোকাবেলা করবেন?
জুলিওমাক

4
এটি কাজ করে না, এটি অনাকাঙ্ক্ষিত অন্যান্য ক্ষেত্রগুলির দ্বারা গ্রুপ করে।
জ্যাক কোলে

4
@ জুলিওম্যাক, আমি বিশ্বাস করি যদি আপনার পছন্দসই আউটপুট $ সর্বাধিক / and মিনিট হয় এবং ক্ষেত্রগুলি যে $group_ আইডে নেই, তবে আপনি $sortপছন্দসই ক্ষেত্রটি নিয়ে আগে কোনও গ্রুপে গ্রুপ এবং ব্যবহার $firstবা $lastঅপারেটর করতে পারেন । জমা করার সময়, অন্যান্য ক্ষেত্রগুলি অন্তর্ভুক্ত করার ধারণা (যা সঞ্চিত / মজাদার / হ্রাসযুক্ত) এমনকি তাত্ত্বিকভাবে এতটা বোঝায় না। তবে হাতের আগে বাছাই করা প্রতিটি গ্রুপকে নিজের মধ্যে বাছাইয়ের তুলনায় আসলে অকার্যকর কারণ বাছাই করা অ্যালগরিদমগুলি ও (এন) এর চেয়ে জটিল। আমি আশা করি মোঙ্গোডিবিতে আরও ভাল উপায় হতে পারে।
ভেমুলো

16

যাইহোক, আপনি যদি কেবল প্রথম দস্তাবেজই রাখতে চান না তবে আপনি $ addToSet ব্যবহার করতে পারেন উদাহরণস্বরূপ:

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

4
ধন্যবাদ! এটি আরও ভাল হয়েছে (সেট দিয়ে অর্ডার জগাখিচুড়ি এড়াতে): ডেটা: {$ অ্যাডটোসেট: {নাম: '$ নাম', _ আইডি: '$ _আইডি', বয়স: '$ বয়স'}}
বেনোইট

14

[মন্তব্য পরামর্শ অন্তর্ভুক্ত সম্পাদনা]

আমি এখানে উত্তর খুঁজতে এসেছি তবে নির্বাচিত উত্তরের সাথে সন্তুষ্ট ছিল না (বিশেষত বয়সটি দেওয়া হয়েছে)। আমি এই উত্তরটি পেয়েছি যা আরও ভাল সমাধান (অভিযোজিত):

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

4
কিন্তু, আপনি countক্ষেত্রটি হারাবেন । $mergeObjectsএটি রাখতে আপনার প্রয়োজন ।
0zkr প্রধানমন্ত্রী

4
$ মার্জওবজেক্টগুলি ব্যবহার করে অন্যকে সিনট্যাক্সে সহায়তা করার বিষয়ে 0 জিসির মন্তব্য সম্পর্কে বিস্তারিত জানাতে শেষ পাইপলাইন সিনট্যাক্সটি হবে{"$replaceRoot": {"newRoot": {"$mergeObjects": ["$person", {count: "$count"}]}}}
জেরেন সাউন্ডার্স

7

আপনি এটি চেষ্টা করতে পারেন

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

}

4

এটি আমি যা করেছি, এটি কাজ করে।

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 
  }
}])

4

কেউ যদি বহু ক্ষেত্র সহ দস্তাবেজগুলির সাথে একই সমস্যার মুখোমুখি হন তবে কেবল একটি দ্রুত আপডেট। $replaceRootপাইপলাইন পর্যায় এবং $mergeObjectsপাইপলাইন অপারেটরের সংমিশ্রণের শক্তিটি কেউ ব্যবহার করতে পারেন ।

db.users.aggregate([
  {
    $group: {
      _id: '$name',
      user: { $first: '$$ROOT' },
      count: { $sum: 1 }
    },
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: [{ count: '$count' }, '$user'] }
    }
  }
])

4

ব্যবহার করুন $firstসঙ্গে $$ROOTডকুমেন্ট এবং তারপর ব্যবহার $replaceRootপ্রথম ক্ষেত্র সহ।

db.test.aggregate([
  { "$group": {
    "_id": "$name",
    "doc": { "$first": "$$ROOT" }
  }},
  { "$replaceRoot": { "newRoot": "$doc" }}
])

এটি এত সহায়ক ছিল! ধন্যবাদ!! আমি কিছুক্ষণ অনুসন্ধান করেছিলাম, তবে আমার কী প্রয়োজন তা ঠিক পাইনি। এই নিখুঁত ছিল!
ছাত্র সোল

এই উত্তরটি 'বিন্দুতে' এবং নিখুঁত। ধন্যবাদ!
এম নুনিসা

1

আমি .groupসহায়ক সম্পর্কে জানতাম না , তবে আপনি যদি একত্রিতকরণ ফ্রেমওয়ার্কের সাথে যেতে পছন্দ করেন , তবে আপনাকে কোন ক্ষেত্রগুলি ফিরতে হবে তা নির্দিষ্ট করতে হবে। আমি ভুল হলে আমাকে সংশোধন করুন, তবে এসকিউএল-তে আপনাকে যেভাবেই করতে হবে।

ঠিক আছে, আপনি পূর্বে উল্লিখিত সমষ্টি ফ্রেমওয়ার্কটি দিয়ে এটিই করবেন:

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

10
আপনার সহযোগিতার জন্য ধন্যবাদ. এই ক্যোয়ারিতে গ্রুপ নির্দিষ্ট ক্ষেত্রগুলি রয়েছে, আমি কেবল একটি ক্ষেত্র দ্বারা গোষ্ঠী চাই এবং তারপরে অন্যরা ক্ষেত্র নির্দিষ্ট করে। কোন ভাল ধারণা?
প্লাসর

1

আমি এই ফাংশনটি আনইন্ডাইন্ড স্টেজকে বিপরীতমুখী করে তোলার জন্য তৈরি করেছি ... আপনি যদি এটির সাথে কোনও বাগ উপস্থিত করেন তবে আমাকে জানান, তবে এটি আমার পক্ষে ভাল কাজ করছে!

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
}

সেরা সংগ্রহ যখন একই সংগ্রহের নথির বিভিন্ন ক্ষেত্রের নাম থাকে।
ব্যবহারকারী7364588

0

আপনি যদি সমস্ত ক্ষেত্র প্রজেক্ট করতে চান তবে কোয়েরির নীচে এই ব্যবহারটি নথি করুন।

db.persons.aggregate({
      { $group: { _id: '$name', data: { $push: '$$ROOT' }, total: { $sum: 1 }} },
      {
        $project: {
          _id:0,
          data:1,
          total :1
        }
      }
}

-1

উত্তর >>>> এখানে

    $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();

আপনার ইনপুট টেবিলটি প্রথমে সেট করুন
পঙ্কজ চীমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.