【问题标题】:Get Group list with Member data where User is not member or owner of group获取包含成员数据的组列表,其中用户不是组的成员或所有者
【发布时间】:2017-08-04 13:49:30
【问题描述】:

我有两个像下面这样的集合,我对查询感到困惑,请任何人帮忙解决,

组:

var WorkKrewSchema = mongoose.Schema({
    content_detail: {
        name: String,
        description: String
    },
    business_info: {
        name: String,
        address: String,
        city: String,
        state: String,
        zipcode: String,
        website: String,
        starting_hours: Date,
        ending_hours: Date,
        days: Array
    },
    created_by: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    created_on: Date,
    updated_on: Date
});

成员:

var KrewPartnerSchema = mongoose.Schema({
    Work_krew_id: {
        type: mongoose.Schema.Types.ObjectId 
    },
    members: [
        {
            refrence_id: mongoose.Schema.Types.ObjectId,
            is_sub_admin: {
                type: Boolean,
                default: false
            },
            status: {
                type: String,
                enum: ['accepted', 'declined', 'pending']
            },
            date_of_join: Date
        }
    ]
});

获取群组,其中:

  • 用户既不是该组的所有者,也不是成员,
  • 如果用户是会员,则状态应为待处理

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    假设您有一个集合Groups,其中包含以下形式的文档:

    {
        "_id" : ObjectId("598311f3c63f57ec3dcac86f"),
        "grp_name" : "groupA",
        "created_by" : "userA"
    }
    

    ...还有一个集合Members,其中包含以下形式的文档:

    {
        "_id" : ObjectId("59831310c63f57ec3dcac891"),
        "grp_id" : ObjectId("598311f3c63f57ec3dcac86f"),
        "members" : [ 
            {
                "user_id" : "UserY",
                "status" : "pending"
            }, 
            {
                "user_id" : "UserA",
                "status" : "pending"
            }, 
            {
                "user_id" : "UserB",
                "status" : "approved"
            }
        ]
    }
    

    ...您可以为名为 "UserA" 的用户运行以下查询,这应该可以满足您的需要:

    db.getCollection('Members').aggregate(
      {
        $lookup:
        {
          from: "Groups",
          localField: "grp_id",
          foreignField: "_id",
          as: "group"
        }
      },
      {
        $match:
        {
          $or:
          [
            {
              "members.user_id": { $ne: "UserA" },
              "group.0.created_by": { $ne: "UserA" }
            },
            {
              "members":
              {
                $elemMatch:
                {
                  "user_id": "UserA",
                  "status": "pending"
                }
              }
            }
          ]
        }
      }
    )
    

    不过,我建议您将这两个集合合并为一个。组文档应该只包含它的所有成员,在这种情况下,您不需要 $lookup 的东西,并且可以通过简单的查询(没有聚合框架)。

    【讨论】:

    • 我写了相同的条件,但问题是 $in 有多个字段,$or 条件没有根据该条件过滤。
    • 能否给我们一个示例数据集,请问是这样的吗?
    • 我已经用实际的 Schema @dnickless 更新了我的问题
    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多