2017-12-18 12 views
1

こんにちは私はMongoDbを使用しています。グループのコレクションのリストを取得しながら計算カラムが必要です。グループコレクションは、_id,member_id,member_typeの書類を含むmembersアレイを有する。現在のユーザーがそのグループの管理者であるかどうかを確認する必要があります。 member_typeが1の場合、管理者であり、ユーザーもmembersアレイの一部である必要があります。MongoDbの計算カラムを取得する

コレクション構造:

//コレクション: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 
    } 

私は、次のクエリを使用しますが、それはtrueを返す必要があり、falseを返します。

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

あなたはあなたのコードが動作するため、あなたの$members配列を$unwindする必要があります。 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] 
      } 
     } 
    } 
]) 
+0

ありがとう、それは私のために働いたが、私は 'unwind'の使用が何であるかわからない、それはクエリのパフォーマンスを低下させるか? – Nirmal

+0

複数のメンバーを持つことができるので、 '$ unwind'を使う必要があります。 '$ unwind'は配列を平坦化します。 '$ unwind'を使用するとパフォーマンスに多少の影響があると思われますが、無視できるほどです。 – Jaco

関連する問題