2016-12-08 2 views
0

$ lookup을 사용하여 mongodb에서 조인을 수행하고 있습니다. 이제 여기에 문제가 있습니다. 나는 모든 북마크 브랜드와 두 번째 컬렉션에 대한 모든 세부 정보를 포함하는 사용자를 포함하는 두 개의 컬렉션이 있습니다. 이제 사용자가 북마크 한 모든 브랜드 세부 정보를 반환하려고합니다.

컬렉션

{"mobile_no": "8971740148", "brands": ["5829c1df334d40e20e1d1c19", "5829c1df334d40e20e1d1c20", "5829c1df334d40e20e1d1c21"]} 

브랜드

{"_id": ObjectId("5829c1df334d40e20e1d1c19"), "brand_name": "Versace"} 
{"_id": ObjectId("5829c1df334d40e20e1d1c20"), "brand_name": "Lee Cooper"} 
{"_id": ObjectId("5829c1df334d40e20e1d1c21"), "brand_name": "Levis"} 

내 통합 파이프 라인의 코드는 이제

   { $match: { mobile_no: mobile_no }}, 
       { $unwind: { path: "$brands", includeArrayIndex: "brandsposition"}}, 
       { $lookup: {from: "brands",localField: "brands",foreignField: "_id",as: "user_bookmarks"}}, 

아래 내가 직면하고있는 문제를 주어진 컬렉션 user_bookmarked 위의 코드는 아무 것도 반환하지 않으므로 브랜드 id를 내 user_bookmarked 컬렉션에 문자열로 저장하지만 ObjectId로 저장하지 않으므로 아무 것도 반환하지 않습니다. 이제 아무도 집계 쿼리 내에서 필드 형식을 어떻게 변경할 수 있는지 말해 줄 수 있습니까?

두 번째로 물어보고 싶은 것은 $ lookup을 사용할 때 mongodb가 foreign_field에 인덱스를 사용하는지 아닌지 알려주는 것입니다. 왜냐하면 나는 과 함께 집계 파이프 라인 위에 실행했기 때문에 : 사실하지만 위의 쿼리에서 사용 된 인덱스를 찾지 못했습니다. 출력에서 ​​반환했습니다. 이제

db.user_bookmarked.runCommand('aggregate', {pipeline: [{ $match: { mobile_no: mobile_no }}, 
      { $unwind: { path: "$brands", includeArrayIndex: "brandsposition"}}, 
      { $lookup: {from: "brands",localField: "brands",foreignField: "_id",as: "user_bookmarks"}}], explain: true}) 
{ 
     "waitedMS" : NumberLong(0), 
     "stages" : [ 
       { 
         "$cursor" : { 
           "query" : { 
             "mobile_no" : "8971740148" 
           }, 
           "queryPlanner" : { 
             "plannerVersion" : 1, 
             "namespace" : "test.restaurants", 
             "indexFilterSet" : false, 
             "parsedQuery" : { 
               "mobile_no" : { 
                 "$eq" : "8971740148" 
               } 
             }, 
             "winningPlan" : { 
               "stage" : "COLLSCAN", 
               "filter" : { 
                 "mobile_no" : { 
                   "$eq" : "8971740148" 
                 } 
               }, 
               "direction" : "forward" 
             }, 
             "rejectedPlans" : [ ] 
           } 
         } 
       }, 
       { 
         "$unwind" : { 
           "path" : "$brands", 
           "includeArrayIndex" : "brandsposition" 
         } 
       }, 
       { 
         "$lookup" : { 
           "from" : "brands", 
           "as" : "user_bookmarks", 
           "localField" : "brands", 
           "foreignField" : "_id" 
         } 
       } 
     ], 
     "ok" : 1 
} 

사람은 내가 집계 내부 필드의 유형을 변경하는 방법이며, $ 조회 인덱스를 사용하지만, 유용한 아무것도 저를 도와주세요 발견하지 않았습니다 않는이 일의 모두에 대해 검색 한 여기에서 저를 도와 주실 수 있습니다 여기서 사람들은 정말 감탄할 것입니다.

+0

는 왜 상점은 객체 식별자로 ID를 브랜드? 그 일을하는 동안 어떤 문제에 직면 했습니까? – Veeram

+0

개체 ID 크기가 문자열로 비교할 때 큰 및 또한 문자열을 사용하여 내 전체 코드를 작성했습니다 그래서 그냥 idids 문자열을 저장할 싶지 ?? –

답변

1

문자열을 파이프 라인 내의 개체 ID로 변환 할 수 없으면 각 문서를 이동하여 수동으로 변환해야합니다 (유형의 혼합 일치를 저장해서는 안되므로 어쨌든 가치가 있습니다). 장기적으로 업데이트) :

how to convert string to numerical values in mongodb

이 블로그의 통계를 보면, 당신은 인덱스를 사용하는 것이 $ 조회 사용 인덱스 볼 수 있습니다 않는 등을 위해 -

http://guyharrison.squarespace.com/blog/2016/7/4/join-performance-in-mongodb-32-using-lookup.html

+0

감사합니다. 정말 도움이되었습니다. (y). –

+0

제발 내 질문을 참조하십시오 이것도 집합에 대한 http://stackoverflow.com/questions/41090280/in-mongodb-know-index-of-array-element-matched-with-in-operator –

1

은 인구 전에하며 Object에 브랜드를 주조하십시오 :

user_bookmarked.brands.map((brand) => return mongoose.Types.ObjectId(brand)) 

그러나 심판 대신에, 모델 같은 것을 보일 것 같은 당신이 정말로 그들을 저장 고려해야합니다

const user_bookmarked = new mongoose.Schema({ 
    ... 
    brands: [{type: mongoose.Schema.Types.ObjectId, ref: 'Brands'}], 
    ... 
    }) 

그들이하며 Object 될 것입니다이 방법을 출발점에서.! 이 게시물을 설명하는 두 번째 질문에 대해서는

생각 : join-performance-in-mongodb-32-using-lookup

+0

어때? 두 번째 질문 ?? –

+0

제발 내 질문을 참조하십시오 이것도 집합에 대한 http://stackoverflow.com/questions/41090280/in-mongodb-know-index-of-array-element-matched-with-in-operator –

관련 문제