我在mongodb中有一个md5的集合.我想找到所有重复的内容.md5列已编制索引.你知道使用map reduce做任何快速的方法吗?或者我应该迭代所有记录并手动检查重复项?
我目前使用map reduce的方法几乎两次迭代集合(假设重复数量非常少):
res = db.files.mapReduce(
function () {
emit(this.md5, 1);
},
function (key, vals) {
return Array.sum(vals);
}
)
db[res.result].find({value: {$gte:1}}).forEach(
function (obj) {
out.duplicates.insert(obj)
});
Run Code Online (Sandbox Code Playgroud) 我正在使用MongoDB,需要删除重复的记录.我有一个看起来像这样的列表集合:(简化)
[
{ "MlsId": "12345"" },
{ "MlsId": "12345" },
{ "MlsId": "23456" },
{ "MlsId": "23456" },
{ "MlsId": "0" },
{ "MlsId": "0" },
{ "MlsId": "" },
{ "MlsId": "" }
]
Run Code Online (Sandbox Code Playgroud)
如果MlsId不是""或"0"而另一个列表具有相同的MlsId,则列表是重复的.因此,在上面的示例中,需要删除第2和第4条记录.
我如何找到所有重复的列表并将其删除?我开始查看MapReduce,但找不到适合我的情况的示例.
这是我到目前为止,但它没有检查MlsId是"0"还是"":
m = function () {
emit(this.MlsId, 1);
}
r = function (k, vals) {
return Array.sum(vals);
}
res = db.Listing.mapReduce(m,r);
db[res.result].find({value: {$gt: 1}});
db[res.result].drop();
Run Code Online (Sandbox Code Playgroud) 我有一个包含以下格式的条目的集合:
{
"_id" : ObjectId("5538e75c3cea103b25ff94a3"),
"userID" : "USER001",
"userName" : "manish",
"collegeIDs" : [
"COL_HARY",
"COL_MARY",
"COL_JOHNS",
"COL_CAS",
"COL_JAMES",
"COL_MARY",
"COL_MARY",
"COL_JOHNS"
]
}
Run Code Online (Sandbox Code Playgroud)
我需要找出那些重复的大学ID.所以结果应该给出"COL_MARY","COL_JOHNS",如果可能的话,给出重复计数.请给mongo查询找到它.
我在MongoDB上有一个非常大的集合,我想从该集合中删除重复的记录.我想到的第一个想法是删除索引并使用dropDups重建索引.但是,重复的数据太多,MongoDB无法处理.
所以我转向MapReduce寻求帮助.这是我目前的进展.
m = function () {
emit(this.myid, 1);
}
r = function (k, vals) {
return Array.sum(vals);
}
res = db.userList.mapReduce(m,r, { out : "myoutput" });
Run Code Online (Sandbox Code Playgroud)
并且所有重复记录的"myid"都存储在"myoutput"集合中.但是,我不知道如何通过引用myoutput.myid从userList中删除记录.它假设是这样的:
db.myoutput.find({value: {$gt: 1}}).forEach(
function(obj) {
db.userList.remove(xxxxxxxxx) // I don't know how to do so
})
Run Code Online (Sandbox Code Playgroud)
顺便说一句,使用foreach似乎会用理智的myid擦除所有记录.但我只是想删除重复的记录.例如:
{ "_id" : ObjectId("4edc6773e206a55d1c0000d8"), "myid" : 0 }
{ "_id" : ObjectId("4edc6780e206a55e6100011a"), "myid" : 0 }
{ "_id" : ObjectId("4edc6784e206a55ed30000c1"), "myid" : 0 }
Run Code Online (Sandbox Code Playgroud)
最终结果应该只保留一条记录.有人可以给我一些帮助吗?
谢谢.:)
我的数据如下:
{
"foo_list": [
{
"id": "98aa4987-d812-4aba-ac20-92d1079f87b2",
"name": "Foo 1",
"slug": "foo-1"
},
{
"id": "98aa4987-d812-4aba-ac20-92d1079f87b2",
"name": "Foo 1",
"slug": "foo-1"
},
{
"id": "157569ec-abab-4bfb-b732-55e9c8f4a57d",
"name": "Foo 3",
"slug": "foo-3"
}
]
}
Run Code Online (Sandbox Code Playgroud)
foo_list模型中的字段在哪里被称为Bar.请注意,数组中的第一个和第二个对象是完全重复的.
除了切换到PostgresSQL的明显解决方案之外,我可以运行哪些MongoDB查询来删除重复的条目foo_list?
类似的答案并没有完全削减它:
如果数组中有明显的字符串,这些问题就会回答这个问题.但是在我的情况下,数组中充满了对象.
我希望很明显我对查询数据库不感兴趣; 我希望重复项永远不会从数据库中消失.
有聚合管道:
db.getCollection('yourCollection').aggregate(
{
$unwind: {
path: "$dates",
includeArrayIndex: "idx"
}
},
{
$project: {
_id: 0,
dates: 1,
numbers: { $arrayElemAt: ["$numbers", "$idx"] },
goals: { $arrayElemAt: ["$goals", "$idx"] },
durations: { $arrayElemAt: ["$durations", "$idx"] }
}
}
)
Run Code Online (Sandbox Code Playgroud)
执行以下数据(示例文档):
{
"_id" : ObjectId("52d017d4b60fb046cdaf4851"),
"dates" : [
1399518702000,
1399126333000,
1399209192000,
1399027545000
],
"dress_number" : "4",
"name" : "J. Evans",
"numbers" : [
"5982",
"5983",
"5984",
"5985"
],
"goals": [
"1",
"0",
"4",
"2"
],
"durations": [
"78",
"45",
"90",
"90" …Run Code Online (Sandbox Code Playgroud) mongodb mongodb-query aggregation-framework mongodb-aggregation