在Mongodb中查询操作以查找来自同一集合的两个数据集之间的交集

时间:2014-02-16 04:10:46

标签: mongodb

我是Mongo的新手,需要帮助才能形成查询以从mongodb集合中检索以下信息

假设我有一个包含用户与群组关联的集合。可以将用户分配到某些组。在下面的示例中,我想找出属于组(1 OR 2)和组3的用户,它们将返回user1以获取以下数据。虽然user2和user3是group1和group2的一部分,但不会返回,因为它们不属于第3组


{
_id : NumberLong(1),
user : "user1",
group : NumberLong(1),
}
{
_id : NumberLong(2),
user : "user1",
group : NumberLong(2),
}
{
_id : NumberLong(3),
user : "user1",
group : NumberLong(3),
}
{
_id : NumberLong(1),
user : "user2",
group : NumberLong(1),
}
{
_id : NumberLong(1),
user : "user3",
group : NumberLong(2),
}

2 个答案:

答案 0 :(得分:1)

关于你的问题的第一件事是5个文档不能插入到一个集合中,因为3个文档具有相同的_id字段值,并且这个_id字段是mongodb中的主键,因此不能重复单个集合。因此,通过在集合中插入以下数据,

 { "_id" : NumberLong(1), "user" : "user1", "group" : NumberLong(1) }
 { "_id" : NumberLong(2), "user" : "user1", "group" : NumberLong(2) }
 { "_id" : NumberLong(3), "user" : "user1", "group" : NumberLong(3) }
 { "_id" : NumberLong(4), "user" : "user2", "group" : NumberLong(1) } 
 { "_id" : NumberLong(5), "user" : "user3", "group" : NumberLong(2) }

您可以使用mongodb聚合框架查找属于第1组或第2组以及第3组的所有用户。对此的查询将是

  db.user.aggregate({
   $group: {
             _id: "$user",
              grouping: { $addToSet: "$group"} } },
           {  $match: { 
                     $and: [
                            { $or: [{ grouping: { $in: [1,2]}}]},
                            { grouping: 3}
                            ]}});

答案 1 :(得分:0)

这很简单:

db.colection.distinct('user', {$and : [{$or : [{group : 1}, {group : 2}]}, {group : 3}]});

您可以查看有关logical operators的mongodb文档部分。还有distinct