Поиск веса в mongodb

Есть ли способ добавить весовой возраст к определенным полям в Mongo-db без индексации?

Формат документа:

{
    "_id" : "55b3551164518e48",
    "item" : "Item A",
    "price": 400,
    "added_date": "2015-07-22",
    "seller": "Seller A"
},{
    "_id" : "55b3551164518e49",
    "item" : "Item A",
    "price": 200,
    "added_date":"2015-06-21",
    "seller": "Seller B"
}

В документе, подобном приведенному выше, поисковый запрос должен работать на основе приоритета в следующем порядке:

  1. Название предмета
  2. Цена (самая низкая)
  3. Дата добавления (последняя)

Поисковый запрос с «Элементом А» должен работать таким образом, чтобы сначала возвращать вторую запись, поскольку она имеет более низкую цену, хотя первая запись является последней. Есть ли способ добавить вес (важность) в поле в поисковом запросе без индексации.

Я ищу поиск по полю веса, как в

db.blog.createIndex( 
    { 
        content: "text", 
        keywords: "text", 
        about: "text" 
    }, 
    { 
        weights: { 
            content: 10, 
            keywords: 5 
        }, 
        name: "TextIndex" 
     } 
)

но без создания индекса.


person Akash S Prakash    schedule 19.03.2018    source источник
comment
Почему у вас не работает сортировка по цене и дате?   -  person Alex Blex    schedule 19.03.2018
comment
Я думаю, что если вы примените сортировку по первому элементу, затем по цене и, наконец, по добавленной_дате, это может сработать для вас.   -  person Afridi    schedule 19.03.2018
comment
db.blog.createIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5 }, name: "TextIndex" } ) Я искал поиск по полю веса, как указано выше, без индексации.   -  person Akash S Prakash    schedule 19.03.2018
comment
@AkashSPrakash, пожалуйста, обновите вопрос, а не комментируйте его. Вы понимаете, что взвешенный поиск — это полнотекстовый индекс, и вес имеет значение только при сортировке по релевантности? Чтобы ответить на точную формулировку вопроса - нет, веса являются частью индекса и не существуют сами по себе. Я считаю, что вопрос является типичной проблемой XY. Если вы попытаетесь перефразировать его, чтобы спросить, что вам действительно нужно, у вас могут быть лучшие ответы.   -  person Alex Blex    schedule 19.03.2018


Ответы (2)


Используйте структуру агрегации для вычисления данных и сортировки их в соответствии с вашими потребностями.

person Nicolas    schedule 19.03.2018

Используйте следующее:

db.example.aggregate([
    $sort: {item: 1, price: -1, added_date: 1},
    $group: {_id: "$item", price: {$first: "$price"}, added_date: {$first: "$added_date"}}
]);

Поля, необходимые после группировки, нужно будет добавить по отдельности, и это можно сделать с помощью синтаксиса, аналогичного price: {$first: "$price"}. Хотя создание индекса — более оптимизированный способ.

person Rohit Aggarwal    schedule 19.03.2018
comment
db.blog.createIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5 }, name: "TextIndex" } ) Я искал поиск по полю веса, как указано выше, без индексации. - person Akash S Prakash; 19.03.2018
comment
@AkashSPrakash В вопросе конкретно говорится без создания индекса. - person Rohit Aggarwal; 19.03.2018