Я выполняю объединения в 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
}
Теперь может кто-нибудь, пожалуйста, помогите мне отсюда я искал об обеих этой вещи, которая, как изменить тип поля внутри агрегации и делает $ поиска использует индексы, но не нашел ничего полезного, пожалуйста, помогите мне отсюда ребята были бы очень заметны.
Почему не магазин бренды, как идентификаторы объектов ид? Вы столкнулись с какой-либо проблемой при этом? – Veeram
Размер идентификатора объекта большой по сравнению со строками, а также я написал весь свой код, используя строки, поэтому просто хочу сохранить id как строки, а не объекты? –