মঙ্গোডিবিতে নকল রেকর্ড সন্ধান করুন


116

আমি কীভাবে একটি মঙ্গো সংগ্রহে সদৃশ ক্ষেত্রগুলি সন্ধান করব।

আমি "নাম" ক্ষেত্রের কোনওটি নকল কিনা তা পরীক্ষা করতে চাই।

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}

অনেক ধন্যবাদ!


5
এই প্রশ্নের ডুপ্লিকেট পতাকা অবরুদ্ধ। এই প্রশ্নটি ডুপ্লিকেট রেকর্ডগুলি কীভাবে সন্ধান করতে হবে তা রোধ করতে নয়।
হ্যারি কিং

উত্তর:


209

সমষ্টি ব্যবহার করুন nameএবং এর nameসাথে পান count > 1:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

সর্বাধিক কমপক্ষে নকল দ্বারা ফলাফলগুলি সাজানোর জন্য:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
)

"নাম" এর চেয়ে অন্য কলামের নামের সাথে ব্যবহার করতে, " $ নাম " পরিবর্তন করে " $ কলাম_নাম " করুন


1
"$match": {"_id" :{ "$ne" : null } - এখানে অপ্রয়োজনীয়, যেহেতু বিবৃতিটির দ্বিতীয় অংশটি ফলাফলগুলি ফিল্টার করে যথেষ্ট। সুতরাং শুধুমাত্র গ্রুপের জন্য যাচাই করা count > 1হবে।
ব্যাটসক্রিম

5
টিটস @ বিটসক্রিম। name "$ নে": নাল} কেবলমাত্র 'নাম' নাল থাকায় বা অস্তিত্বের ক্ষেত্রে নেই। সমষ্টিটিও নাল গণনা করবে।
anhlc

1
স্বাগত. তবে কেন _idক্ষেত্রটি চেক করুন check groupঅপারেশনের পরে সবসময় নਾਲ না হওয়ার গ্যারান্টিযুক্ত ।
ব্যাটসক্রিম

4
_idএকটি থেকে একটি নথির $groupপর্যায় নাল হতে পারে।
wdberkeley

1
এর আউটপুট কী হবে? আমি যদি চালনা করি তবে আমার যা যা ডকুমেন্ট প্রয়োজন তা হ'ল আমি কেবল নকল আইডি / নাম চাই।
কান্নান টি

24

আপনি জানতে পারেন listএর duplicateনিম্নলিখিত ব্যবহার নামগুলি aggregateপাইপলাইন:

  • Groupসমস্ত রেকর্ড একই থাকার name
  • Matchএর groupsচেয়ে বেশি রেকর্ড রয়েছে তাদের 1
  • তারপরে groupআবার projectসমস্ত সদৃশ নাম হিসাবে array

কোড:

db.collection.aggregate([
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}},
{$match:{"count":{$gt:1}}},
{$project:{"name":1,"_id":0}},
{$group:{"_id":null,"duplicateNames":{$push:"$name"}}},
{$project:{"_id":0,"duplicateNames":1}}
])

ণ; / p &:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }

10

অ্যানহিক দেওয়া উত্তরটি খুব অকার্যকর হতে পারে যদি আপনার কাছে একটি বৃহত ডাটাবেস থাকে এবং বৈশিষ্ট্যটির নামটি কেবলমাত্র কয়েকটি নথিতে উপস্থিত থাকে।

দক্ষতা উন্নত করতে আপনি সমষ্টিতে একটি $ ম্যাচ যুক্ত করতে পারেন।

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

3
db.getCollection('orders').aggregate([  
    {$group: { 
            _id: {name: "$name"},
            uniqueIds: {$addToSet: "$_id"},
            count: {$sum: 1}
        } 
    },
    {$match: { 
        count: {"$gt": 1}
        }
    }
])

ক্ষেত্র অনুসারে প্রথম গোষ্ঠীটি কোয়েরি করুন।

তারপরে আমরা অনন্য আইডিটি পরীক্ষা করে এটি গণনা করি, যদি গণনাটি 1 এর বেশি হয় তবে ক্ষেত্রটি পুরো সংগ্রহে সদৃশ হয় যাতে thing ম্যাচ ক্যোয়ারির মাধ্যমে জিনিসটি হ্যান্ডেল করা যায়।


1
আমার পক্ষেও এটি একটি কাজ করতে সক্ষম হয়নি। ডাউন ভোট!
ম্যাথিউ জি

এই পোস্টটি পুরানো তবে কারওর সাহায্য করতে পারে। এটি পরীক্ষা করে দেখুন আমি এটি আমার স্থানীয় লোকদের সাথে কাজ করে যাচ্ছি check এমনকি আমি এই সম্পর্কে একটি ব্লগ জুড়ে এসেছি। তাকাও এখানে. রচনা করুন / পার্টিকেলস
আমান

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