как использовать полнотекстовый поиск с ассоциативным массивом в mongodb?

#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" } ) . Я не знаю, индексирует ли это поля вложенных документов, но попробовать стоит.