ฉันจะค้นหาฟิลด์ที่ซ้ำกันในคอลเลกชัน Mongo ได้อย่างไร
ฉันต้องการตรวจสอบว่าช่อง "ชื่อ" ซ้ำกันหรือไม่
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
ขอบคุณมาก!
ฉันจะค้นหาฟิลด์ที่ซ้ำกันในคอลเลกชัน Mongo ได้อย่างไร
ฉันต้องการตรวจสอบว่าช่อง "ชื่อ" ซ้ำกันหรือไม่
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
ขอบคุณมาก!
คำตอบ:
ใช้การรวม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} }
]);
หากต้องการใช้กับชื่อคอลัมน์อื่นที่ไม่ใช่ "ชื่อ" ให้เปลี่ยน " $ name " เป็น " $ column_name "
"$match": {"_id" :{ "$ne" : null }
- ไม่จำเป็นที่นี่เนื่องจากส่วนที่สองของคำสั่งจะเพียงพอในการกรองผลลัพธ์ ดังนั้นการตรวจสอบเฉพาะกลุ่มที่ต้องcount > 1
ทำ
_id
สนาม รับประกันได้เสมอว่าจะไม่เป็นโมฆะหลังการgroup
ดำเนินการ
_id
ของเอกสารจากที่$group
เวทีสามารถเป็นโมฆะ
คุณสามารถค้นหา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}}
])
o / p:
{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }
คำตอบที่ anhic ให้อาจไม่มีประสิทธิภาพมากหากคุณมีฐานข้อมูลขนาดใหญ่และมีชื่อแอตทริบิวต์อยู่ในเอกสารบางส่วนเท่านั้น
ในการปรับปรุงประสิทธิภาพคุณสามารถเพิ่มการจับคู่ $ ลงในการรวมได้
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)
db.getCollection('orders').aggregate([
{$group: {
_id: {name: "$name"},
uniqueIds: {$addToSet: "$_id"},
count: {$sum: 1}
}
},
{$match: {
count: {"$gt": 1}
}
}
])
กลุ่มแรกค้นหากลุ่มตามฟิลด์
จากนั้นเราตรวจสอบ Id ที่ไม่ซ้ำกันและนับถ้าจำนวนมากกว่า 1 แสดงว่าฟิลด์นั้นซ้ำกันในคอลเล็กชันทั้งหมดดังนั้นสิ่งนั้นจะถูกจัดการโดย $ match query