【问题标题】:Query operation in Mongodb to find intersection between two dataset from the same collectionMongodb中的查询操作以查找来自同一集合的两个数据集之间的交集
【发布时间】:2014-03-15 10:57:36
【问题描述】:

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

假设我有一个集合,其中包含用户与组的关联。可以将用户分配到某些组。在下面的示例中,我想找出属于组 (1 OR 2) 和组 3 的用户,这将返回 user1 以获取以下数据。虽然 user2 和 user3 分别属于第 1 组和第 2 组,但不会返回,因为它们不属于第 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),
}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    就这么简单:

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

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

    【讨论】:

      【解决方案2】:

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

       { "_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}
                                  ]}});
      

      【讨论】:

      • 感谢 joao 和 Vijay 提供的帮助。 Vijay,我很抱歉在我的示例中有重复的主键。您提供的解决方案对我来说效果很好。 joao,$and 和 $or 子句的独特操作对我不起作用。它给出了空结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2021-11-14
      • 1970-01-01
      • 2021-07-25
      • 2015-08-19
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多