2013-03-14 5 views
0

나는 구조는 아래와 같이있다 : 나는 name 속성에 대해 같은 논리를 적용하려면,Mongo DB에서 배열 내부 요소를 검색하는 방법은 무엇입니까?

db.test.find({"nested_documents.x": 1},{_id: 0, nested_documents: {$elemMatch: {x: 1}}} 

을하지만 :

{ 
    field1: "somevalue", 
    name:"xtz", 
    nested_documents: [ 
         { 
          x:1, 
          y:2, 
          info:[ 
            {name:"sachin",value:"test"}, 
            {name:"sachin", value:"test"} 
           ] 
         }, 
         { 
          x:1, 
          y:3, 
          info:[ 
            {name:"sachin1",value:"test"}, 
            {name:"sachin2", value:"test"} 
           ] 
         }, 
         { 
          x:4, 
          y:3, 
          info:[ 
            {name:"sachin",value:"test"}, 
            {name:"sachin", value:"test"} 
           ] 
         } 
        ] 
    } 

는 내가 코드 아래 사용하여 1 차 배열의 내부 요소의 존재를 검색 할 수 있다는 것을 알고. 'sachin'이라는 이름의 문서 만 검색하려고합니다.

db.test.find({"nested_documents.info.name": "sachin"}, 
     {_id: 0, 'nested_documents.info': {$elemMatch: {name: "sachin"}}}); 

그러나 몽고 DB는 지원하지 않습니다 말한다 : 나는 시도가 어떤 는 다음과 같습니다 '.' .? :(투사 내부
연산자이 작업을 수행하는 다른 방법이 있나요 문서를 삽입 할

명령 (명령 프롬프트 또는 코드를 사용하여)은 다음과 같습니다

db.test.insert({ 
    field1: "somevalue", 
    name:"xtz", 
    nested_documents: [ 
         { 
          x:1, 
          y:2, 
          info:[ 
            {name:"sachin",value:"test"}, 
            {name:"sachin", value:"test"} 
           ] 
         }, 
         { 
          x:1, 
          y:3, 
          info:[ 
            {name:"sachin1",value:"test"}, 
            {name:"sachin2", value:"test"} 
           ] 
         }, 
         { 
          x:4, 
          y:3, 
          info:[ 
            {name:"sachin",value:"test"}, 
            {name:"sachin", value:"test"} 
           ] 
         } 
        ] 
    } 
    ) 

나는대로 출력을 기대하고있다 :

{ "_id" : ObjectId("5142e0f153cd2aab3a3bae5b"), 
"nested_documents" : [ 
         {  "x" : 1,  "y" : 2,  
         "info" : [  
            {  "name" : "sachin",  "value" : "test" }, 
            {  "name" : "sachin",  "value" : "test" } 
           ] 
         }, 
         {  "x" : 4,  "y" : 3,   
         "info" : [  {  "name" : "sachin",  "value" : "test" }, 
             {  "name" : "sachin",  "value" : "test" } 
           ] 
         } 
        ] 
} 
+1

샘플 문서를 편집하여 삽입물에 직접 붙여 넣을 수 있다면 도움이됩니다. – JohnnyHK

+0

@JohnnyHK : 코드를 업데이트했습니다. – Sach

+0

이것은 다른 질문의 또 다른 맛입니다. 집계 프레임 워크를 사용하여이 작업을 수행하는 방법에 관한 해당 질문에 링크 된 복제본을 참조하십시오. – JohnnyHK

답변

0
당신은 다음과 같이 이중 $를 해제하는() 집계를 사용해야합니다

:

db.test.aggregate([ 
    // filter for documents with x=1 
    // note: this will use an index, if defined on "nested_documents.x" 
    //{ $match: { "nested_documents.x": 1 } }, 
    // reduce data to nested_documents, as other fields are not considered 
    { $project: { nested_documents: 1 } }, 
    // flatten the outer array 
    { $unwind: "$nested_documents" }, 
    // filter for nested_documents with x=1 
    // note that at this point nested_documents is no longer an array 
    //{ $match: { "nested_documents.x": 1 } }, 
    // flatten the inner array 
    { $unwind: "$nested_documents.info" }, 
    // filter for nested_documents.info.name = "sachin" 
    // note that at this point nested_documents.info is no longer an array 
    { $match: { "nested_documents.info.name": "sachin" } }, 
    // format output: re-create inner array 
    { $group: { _id: { id: "$_id", 
         nested_documents: { 
          x: "$nested_documents.x", 
          y: "$nested_documents.y" 
         } 
        }, 
        info: { $push: "$nested_documents.info" } } }, 
    { $project: { "nested_documents.x": "$_id.nested_documents.x", 
        "nested_documents.y": "$_id.nested_documents.y", 
        "nested_documents.info": "$info" } }, 
    // format output: re-create outer array 
    { $group: { _id: "$_id.id", nested_documents: { $push: "$nested_documents" } } }, 
]) 

참고 : 난 당신이 위의 예

에 있었다으로 X = 1 필터링 // 주석으로 논리를 넣어 그 결과는 다음과 같습니다 집계에 대한 자세한 내용은

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("515d873457a0887a97cc8d19"), 
      "nested_documents" : [ 
       { 
        "x" : 4, 
        "y" : 3, 
        "info" : [ 
         { 
          "name" : "sachin", 
          "value" : "test" 
         }, 
         { 
          "name" : "sachin", 
          "value" : "test" 
         } 
        ] 
       }, 
       { 
        "x" : 1, 
        "y" : 2, 
        "info" : [ 
         { 
          "name" : "sachin", 
          "value" : "test" 
         }, 
         { 
          "name" : "sachin", 
          "value" : "test" 
         } 
        ] 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 

, http://docs.mongodb.org/manual/applications/aggregation/ 참조

관련 문제