Mongodb中的不交集

嗨,他有一个MongoDB集合matchedpairs,其数据结构如下:

每个文档都定义了彼此的成对连接,即1与2合并,而2与10合并,等等。

{
    x:1,y:2
},{
    x:2,y:10
},{
    x:9,{
    x:8,y:4
}

我想查询文档并检索成对的唯一不相交集,即返回这样的结果

{
    set:[1,2,9,10]
},{
    set:[8,4]
}

我熟悉聚合框架,但是看不到如何在$group阶段创建正确的累加器以创建不相交集。下面的尝试仅给出一组相似的对。正如我所看到的,我必须创建一个完整的$ group阶段字符串(取决于我的数据集)才能得到我想要的结果。这里有什么聪明的主意吗?

db.matchedpairs.aggregate([
    {
        '$group': {
            '_id': '$y','like': {
                '$addToSet': '$x'
            },'from': {
                '$addToSet': '$y'
            }
        }
    },{
        '$project': {
            '_id': 0,'set': {
                '$setUnion': [
                    '$like','$from'
                ]
            }
        }
    }
]

给予:

{
 set:[4,8]
},{
 set:[10,9]
},{
 set:[1,2]
}
java21710397 回答:Mongodb中的不交集

将其转换为数组并使用mapreduce或自定义脚本可能会有所帮助

db.matchedpairs.aggregate([
{ $project:{'set':['$x','$y']}},{
        '$group': {
            '_id': '1','list': {
                '$addToSet': '$set'
            }
        }
},{
  $out:'matchedpairs2'
}
]);


//gives => matchedpairs2

{
    "_id" : "1","list" : [ 
        [ 
            1,2
        ],[ 
            9,10
        ],[ 
            2,[ 
            8,4
        ]
    ]
}
var map = function() {
  emit("list",this.list);
};

var emit = function(key,value) {
  const result = [];
  const result2 = [];

  value.map((item,i) => {
    const distinct = value.filter((w,j) => i != j);
    const convertset = [...new Set([].concat(...distinct))];
    const b = new Set(convertset);
    const intersection = item.filter(x => b.has(x));
    const diff = item.filter(x => !b.has(x));
    if (intersection.length > 0) result.push(item);
    if (diff.length > 0) result2.push(item);
  });

  const set1 = [...new Set([].concat(...result))];
  const set2 = [...new Set([].concat(...result2))];
  const w = new Set(set1);
  const diff2 = set2.filter(x => !w.has(x));
  const finalset = [...new Set([].concat(...diff2))]

  print(set1);
  print(finalset);
};

var myCursor = db.matchedpairs2.find({});

while (myCursor.hasNext()) {
  var doc = myCursor.next();
  map.apply(doc);
}

结果:


/* 1 */
[
    9.0,10.0,1.0,2.0
]

/* 2 */
[
    8.0,4.0
]
本文链接:https://www.f2er.com/3084827.html

大家都在问