在MongoDb中获取计算列

时间:2017-12-18 10:45:27

标签: mongodb

您好我正在使用MongoDb,因为我需要一个计算列,同时检索组的集合列表。群组集合包含members数组,其中包含_idmember_idmember_type的文档。我需要检查当前用户是否是该组的管理员。如果member_type为1则为admin,用户也必须属于members数组。

收集结构:

// collection:user_groups

    {
     "_id" : ObjectId("5a339d6cc2d708402ebe53e5"),
     "group_description" : "desc",
     "members" : [
       {
          "member_id" : ObjectId("5a335b81d51ba494223227bb"),
          "member_type" : 1,
          "created_at" : ISODate("2017-12-15T15:31:16.566+05:30"),
          "updated_at" : ISODate("2017-12-15T15:31:16.566+05:30"),
          "_id" : ObjectId("5a339d6cc2d708402ebe53e6")
       }
     ],
     "is_admin" : false
     }

我使用了以下查询但返回false,它应该返回true。

db.user_groups.aggregate([{$match:{_id:ObjectId("5a339aaac2d708402ebe53e5")}},
{$project:{members: 1,group_description:1,is_admin:{$cond:[{$and:[{$eq:
['$members.member_type',1]},{$eq:
['$members.member_id',ObjectId("5a335aaad51ba494223227bb")]}]},true,false]}}}])

1 个答案:

答案 0 :(得分:1)

您需要$unwind $members数组才能使代码正常工作。如果members是嵌入的子文档而不是嵌入的子文档数组,那么您的代码将起作用。

db.user_groups.aggregate([{
        $match: {
            _id: ObjectId("5a339d6cc2d708402ebe53e5")
        }
    },
    {
       $unwind:"$members"
    },
    {
        $project: {
            members: 1,
            group_description: 1,
            is_admin: {
                $cond: [{
                    $and: [{
                        $eq: ['$members.member_type', 1]
                    }, {
                        $eq: ['$members.member_id', ObjectId("5a335b81d51ba494223227bb")]
                    }]
                }, true, false]
            }
        }
    }
])