2017-03-01 7 views
0
{ 

     "id" : "Sir3GHMQ", 
     "name" : "Medavakkam", 
     "userList" : [ 
      { 
       "loginName" : "[email protected]", 
       "role" : "ADMIN" 
      }, 
      { 
       "loginName" : "[email protected]", 
       "role" : "Operator" 
      } 
     ] 
    } 


    { 

     "id" : "Sir3GHER", 
     "name" : "Medavakkam", 
     "userList" : [ 
      { 
       "loginName" : "[email protected]", 
       "role" : "OPERATOR" 
      }, 
{ 
       "loginName" : [email protected]", 
       "role" : "OPERATOR" 
      } 
     ] 
    } 

コレクションでは、userList. loginame="[email protected]"のロールが「管理者」の場所もチェックするドキュメントを取得する必要があります。 roleがadminの場合は、すべてのuserList:LoginNameをロールで取得し、そうでない場合はuserList:loginNameのみをロールで取得します。ネストされた配列ドキュメントを取得する

私はこの試みた:出力データ、私はこのコマンドこの

{ 

    "id" : "Sir3GHMQ", 
    "name" : "Medavakkam", 
    "userList" : [ 
     { 
      "loginName" : "[email protected]", 
      "role" : "ADMIN" 
     }, 
     { 
      "loginName" : "[email protected]", 
      "role" : "Operator" 
     } 
    ] 
} 


{ 

    "id" : "Sir3GHER", 
    "name" : "Medavakkam", 
    "userList" : [ 
     { 
      "loginName" : "[email protected]", 
      "role" : "OPERATOR" 
     } 

    ] 
} 
+0

だから、 'Venkatさん@ gmail.com'として' loginName'を持つすべてのドキュメントを検索する必要がありますか? 'db.Site.find({" userList.loginName ":" [email protected] "})'を試してみませんか? – Veeram

+0

yes.loginNameとして[email protected] – venkat

答えて

3

使用のような出力を必要とする

  db.f.aggregate([{ 
      $match: { 
       "userList.loginName": "[email protected]" 
      } 
     }, { 
      "$redact": { 
       "$cond": [{ 
        $or: [{ 
         "$eq": [{ 
           "$ifNull": ["$loginName", "[email protected]"] 
          }, 
          "[email protected]" 
         ] 
        }, { 
         "$eq": [{ 
          $setIsSubset: [{ 
           $literal: [{ 
            loginName: "[email protected]", 
            role: "ADMIN" 
           }] 
          }, "$$ROOT.userList"] 
         }, true] 
        }] 
       }, "$$DESCEND", "$$PRUNE"] 
      } 
     }]).pretty() 

db.Site.aggregate([ 
    { "$match": { "userList.loginName": "[email protected]" } }, 
    { "$redact": { 
     "$cond": [ 
      { "$eq": [ 
       { "$ifNull" [ "$loginName", "[email protected]" ] }, 
       "[email protected]" 
      ] }, 
      "$$DESCEND", 
      "$$PRUNE" 
     ] 
    } } 
]) 

を:

 { 
    "_id" : ObjectId("58b697e406169b8451ba4cd2"), 
    "id" : "Sir3GHMQ", 
    "name" : "Medavakkam", 
    "userList" : [ 
      { 
        "loginName" : "[email protected]", 
        "role" : "ADMIN" 
      }, 
      { 
        "loginName" : "[email protected]", 
        "role" : "Operator" 
      } 
    ] 
    } 

    { 
    "_id" : ObjectId("58b74e91c568ace843ee17c1"), 
    "id" : "Sir3GHER", 
    "name" : "Medavakkam", 
    "userList" : [ 
      { 
        "loginName" : "[email protected]", 
        "role" : "OPERATOR" 
      } 
    ] 
} 

これがあなたを助けてくれることを願っています。

Javaコード:

   MongoClient mongoClient = new MongoClient(); 
       MongoDatabase database = mongoClient.getDatabase("test"); 
       MongoCollection<Document> collection = database.getCollection("f"); 

       List<Document> results = collection.aggregate(Arrays.asList(new Document("$match",new Document().append("userList.loginName", "[email protected]")), 
         new Document("$redact", new Document("$cond", 
           Arrays.asList(new Document("$or",Arrays.asList(new Document("$eq", 
             Arrays.asList(new Document("$ifNull", Arrays.asList("$loginName", "[email protected]")), "[email protected]")),new Document("$eq", Arrays.asList(new Document("$setIsSubset", Arrays.asList(new Document("$literal", Arrays.asList(new Document().append("loginName", "[email protected]").append("role", "ADMIN"))),"$$ROOT.userList")), true)))), 
           "$$DESCEND", "$$PRUNE"))) 

      )).into(new ArrayList<Document>()); 

       for(Document docs: results){ 
        System.out.println(docs.toJson()); 
       } 
+0

ありがとうたくさん....その作業 – venkat

+0

どのように私はこのクエリをJavaで実装することができます – venkat

+0

こんにちは@radhaKrishnanあなたは素晴らしいです。ありがとう...... – venkat

関連する問題