#arrays #mongodb
#массивы #mongodb
Вопрос:
Я использую mongodb db.version()
-> 4.4.1, и в моей коллекции я создаю индекс для полнотекстового поиска, где я включаю столбец gFields, в котором есть tybe hash
— ассоциативный массив с ключевой строкой и значением, моя цель — также искать по строковому значению в этом массиве, посмотрите мой индекс, пожалуйста:
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "TDProductId_text_name_text_categories_text_MerchantCategoryName_text_description_text_price_text_brand_text_sku_text_model_text_declineReasonClass_text_shop_text_identityUniqData_text_gFields_text",
"sparse" : false,
"background" : false,
"weights" : {
"MerchantCategoryName" : 1,
"TDProductId" : 1,
"brand" : 1,
"categories" : 1,
"declineReasonClass" : 1,
"description" : 1,
"gFields" : 1,
"identityUniqData" : 1,
"model" : 1,
"name" : 1,
"price" : 1,
"shop" : 1,
"sku" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
gFields
столбец присутствует, похоже, что shold работает, потому что в документе mongodb говорится: «MongoDB предоставляет текстовые индексы для поддержки запросов текстового поиска по содержимому строки. текстовые индексы могут включать любое поле, значением которого является строка или массив строковых элементов.» У меня есть массив элементов srtring, но когда я пытаюсь выполнить запрос, я сталкиваюсь с пустым результатом
db.getCollection('TradeDoublerProduct').aggregate(
[
{ $match: { $text: { $search: "female" } } },
{ $sort: { score: { $meta: "textScore" } } },
{ $project: { _id: 0, score: { $meta: "textScore" } } },
{ $skip : 0 },
{ $limit : 10 }
],
{ "allowDiskUse" : true }
)
Результат
Fetched 0 record(s) in 0ms
Но у меня есть документ в коллекции, который имеет
"gFields" : {
"(field)g:additional_image_link" : "https://www.desigual.com/dw/image/v2/BCVV_PRD/on/demandware.static/-/Sites-desigual-m-catalog/default/images/B2C/18SWEDX4_5048_3.jpg",
"(field)g:material" : "COTTON",
"(field)g:mpn" : "18SWEDX45048L",
"(field)g:item_group_id" : "18SWEDX4",
"(field)g:color" : "BLUE",
"(field)ProductoID" : "18SWEDX45048L",
"(field)g:size" : "L",
"(field)g:gender" : "female",
"(field)g:age_group" : "adult"
},
female
строка предварительно установлена в ключе «(поле) g: пол». Что в этом плохого и как использовать полнотекстовый поиск с ассоциативным массивом в mongodb?
Это работает, когда я использую массив с ключом -> balue
"gFields" : [
"https://www.desigual.com/dw/image/v2/BCVV_PRD/on/demandware.static/-/Sites-desigual-m-catalog/default/images/B2C/20WGKK03_5000_2.jpg",
"ELASTANE, COTTON",
"20WGKK035000S",
"20WGKK03",
"BLUE",
"20WGKK035000S",
"S",
"female",
"kids"
],
но я хочу знать, возможно ли его использование с ассоциативным массивом?
Комментарии:
1. Это примерное
gFields
значение является объектом, а не массивом.2. хм, доступен ли тип ассоциативного массива в mongodb?
3. Чем ассоциативный массив будет отличаться от объекта BSON?
4. Попробуйте построить с подстановочным знаком типа
db.collection.createIndex( { "$**": "text" } )
. Я не знаю, индексирует ли это поля вложенных документов, но попробовать стоит.