跨多个MongoDb集合查找重复项
来自MySQL,我想知道,我们如何在MongoDB的多个集合中找到重复项 假设我有两个(或更多)收藏: 人类:跨多个MongoDb集合查找重复项,mongodb,Mongodb,来自MySQL,我想知道,我们如何在MongoDB的多个集合中找到重复项 假设我有两个(或更多)收藏: 人类: _身份证 名字 猫: _身份证 绰号 列出重复名称的有效解决方案是什么。这包括名称是否仅由2+用户使用、仅由2+猫使用或至少由一个用户和一只猫使用。因此,我们的结果应该包含两个集合的副本以及这些集合的副本(同名猫和人类) 预期结果: 重复值的列表、出现次数可能很有趣,但不是必需的 问题不是建议的db模式在这种情况下是否合适,而是最佳的MongoDB解决方案 编辑 我对副本的描
- _身份证
- 名字
- _身份证
- 绰号
问题不是建议的db模式在这种情况下是否合适,而是最佳的MongoDB解决方案 编辑 我对副本的描述并不是我想要的,如果它不存在于一个集合中,但在另一个集合中复制,它仍然是一个副本我发现的解决方案: 代码:
mapHuman = function() {
var values = {
name: this.firstname
};
emit(this._id, values);
};
mapCat = function() {
var values = {
name: this.name
};
emit(this._id, values);
};
reduce = function(k, values) {
var result = {names: []};
values.forEach(function(value) {
result.names.push(value.slug);
});
return result;
};
db.human.mapReduce(mapUsers, reduce, {"out": {"reduce": "name"}});
db.cat.mapReduce(mapUsers, reduce, {"out": {"reduce": "name"}});
db.name.aggregate(
{"$group" : { "_id": "$value.name", "count": { "$sum": 1 } } },
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0}},
{"$out": "duplicate"}
)
db.duplicate.find()
对于MongoDB 3.2中的两个集合,您可以使用聚合(它相当于您在MySQL中使用的左外部联接): 阶段:
[
{ _id: "Bob", catsCount: 2 },
{ _id: "Alex", catsCount: 1 }
]
注意:如果您需要加入多个集合,您可以多次应用$lookup stage。您正在运行哪个mongod版本?它不适用于真正的用例,仅用于知识,所以让我们假设最后一个,3。4@DessDess请记住,MongoDB与MySQL等关系数据库不同。它提供了良好的可伸缩性、无模式文档和将数据嵌入文档的选项(例如,用户地址列表)。但是它没有多文档事务,这里连接的主要目的是报告。是的,我同意这种情况不应该发生在设计良好的模式中,这只是一个悬而未决的问题。关于你的回答,我发现我的问题没有得到很好的解释。很抱歉,如果我们也希望复制的用户被认为是复制的呢?我已经根据Lyok更新了我的问题,当然你可以将这个结果与两个查询结合起来,从每个集合中获得重复的结果,这样你的答案仍然是好的,但是有没有一种方法可以在单个查询中实现呢?@desss不幸的是,mongo只支持左连接。如果您不仅要检查集合之间的重复项,而且还要检查集合内的重复项,那么您应该在应用程序级别进行检查。也就是说,您还需要一个查询来检查
{$group:{{u id:“$昵称”,count:{$count:1}}}
[
{ _id: "Bob", catsCount: 2 },
{ _id: "Alex", catsCount: 1 }
]