跨多个MongoDb集合查找重复项

跨多个MongoDb集合查找重复项,mongodb,Mongodb,来自MySQL,我想知道,我们如何在MongoDB的多个集合中找到重复项 假设我有两个(或更多)收藏: 人类: _身份证 名字 猫: _身份证 绰号 列出重复名称的有效解决方案是什么。这包括名称是否仅由2+用户使用、仅由2+猫使用或至少由一个用户和一只猫使用。因此,我们的结果应该包含两个集合的副本以及这些集合的副本(同名猫和人类) 预期结果: 重复值的列表、出现次数可能很有趣,但不是必需的 问题不是建议的db模式在这种情况下是否合适,而是最佳的MongoDB解决方案 编辑 我对副本的描

来自MySQL,我想知道,我们如何在MongoDB的多个集合中找到重复项

假设我有两个(或更多)收藏:

人类:

  • _身份证
  • 名字
猫:

  • _身份证
  • 绰号
列出重复名称的有效解决方案是什么。这包括名称是否仅由2+用户使用、仅由2+猫使用或至少由一个用户和一只猫使用。因此,我们的结果应该包含两个集合的副本以及这些集合的副本(同名猫和人类)

预期结果:

重复值的列表、出现次数可能很有趣,但不是必需的


问题不是建议的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(即人名)具有相同昵称的猫附加到每个组数组
  • 过滤掉那些在猫集合中没有任何匹配项的人类
  • 项目结果仅获取名称和匹配计数
  • 结果看起来像

    [
      { _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 }
    ]