2016-12-08 4 views
0

Я выполняю объединения в mongodb, используя $ lookup, теперь я столкнулся с проблемой здесь. У меня есть две коллекции, первая из которых содержит пользователей всех марок закладок, а вторая содержит всю информацию о торговых марках. Теперь я пытаюсь вернуть все данные о брендах, отмеченные пользователем.

user_bookmarked Коллекция

{"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"}}, 

Теперь проблема я обращенную I что код выше ничего не возвращает, поскольку я храню идентификаторы брендов в качестве строки в моей коллекции user_bookmarked, но не как ObjectId, поэтому ничего не возвращается. Теперь кто-нибудь может рассказать мне, как я могу изменить тип поля внутри запроса агрегации.

Вторая вещь, которую я хочу спросить, скажите, пожалуйста, при использовании $ lookup, тогда mongodb использует индекс на foreign_field или нет. Поскольку я побежал над конвейером агрегации с , объясните: true, но я не нашел ни одного индекса, который был использован вышеуказанным запросом. Я получил это, возвращенный выходом.

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

Почему не магазин бренды, как идентификаторы объектов ид? Вы столкнулись с какой-либо проблемой при этом? – Veeram

+0

Размер идентификатора объекта большой по сравнению со строками, а также я написал весь свой код, используя строки, поэтому просто хочу сохранить id как строки, а не объекты? –

ответ

1

Вы не можете преобразовать строку в идентификатор объекта внутри конвейера, вам придется идти через каждый документ и преобразовывать его вручную, используя что-то вроде (вы все равно не должны хранить смешанное соответствие типов, так что, вероятно, стоит обновление в долгосрочной перспективе):

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

Попробуйте литья ваши бренды ObjectIds до вашего населения:

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

Но вы действительно должны рассмотреть их хранение в качестве рефов вместо этого, ваша модель должна выглядеть примерно так:

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

Таким образом, они будут ObjectIds от начала.!

Что касается второго вопроса это сообщение объясняет это я думаю: 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 –

Смежные вопросы