полнотекстовый поиск mongodb возвращает повторяющиеся элементы при сортировке и фильтрации

#javascript #node.js #mongodb #mongoose

Вопрос:

Я использую полнотекстовый поиск в своем API и сортировку по баллам. Проблема в том, что после поиска я обычно получаю товар более одного раза, и это не то поведение, которого я ожидал. Пожалуйста, как я могу это исправить?

вот как спроектирован мой маршрутизатор

 router.get('/place', async (req, res) => {
    const match = {
        deactivated: false,
    }
    const sort = {}

    if (req.query.search) {
        match.$text = {$search: req.query.search}
        sort.score = {$meta: "textScore"}
    }

    const noOnPage = parseInt(req.query.limit) || 20
    const pageNo = (parseInt(req.query.page)-1)*parseInt(req.query.limit) || 0
    const endIndex = parseInt(req.query.page)*parseInt(req.query.limit)
    const next = parseInt(req.query.page) 1
    const previous = parseInt(req.query.page)-1

    try {
        const count = await Place.find(match).countDocuments().exec()

        const place = await Place.find(match, sort)
        .limit(noOnPage)
        .skip(pageNo)
        .sort(sort)

        const result = {}

        // Shows the search result count
        result.resultCount = count

        // Shows the previous page number
        if (parseInt(req.query.page)!=1) {
            result.previous = previous
        }

        // Shows the next page number
        if (endIndex < count) {
            result.next = next
        }

        // assigns the search results to variable names results
        result.results = place

        res.status(200).send(result)
    } catch (e) {
        res.status(400).send({ "message": "something went wrong please reload page" })
    }
})
 

Ответ №1:

Вы можете попробовать использовать модуль разбиения на страницы мангуста.ниже приведены простые изменения, которые вам нужно будет внести.

Пример модели пользователя:

 import {model, Schema} from 'mongoose';
const mongoosePaginate = require('mongoose-paginate-v2');

 const userSchema = new Schema({
 firstname: { type: String,trim:true},
 lastname: { type: String,trim:true},
 isconfirmed:{type:Boolean,default:false},
 },

 {timestamps:true});
 userSchema.plugin(mongoosePaginate);
 const appUsers:any = model('appusers', userSchema);
 export default appUsers;
 

Пример метода получить всех пользователей, обратите внимание, что сортировка может быть передана в параметрах. Вы можете играть с объектом опций, как вам заблагорассудится

  getAllUsers(req:Request,res:Response){

    const options = {page: req.body.page?req.body.page:1,limit: 10,collation: 
    {locale: 'en'},sort:{createdAt:-1},select: {_id:1,firstname:1,lastname:1}};

   appUsers.paginate({}, options, function(err:any, result:any) {
     if(err){
        res.status(500).json({status:false,msg:"Failed to fetch All 
        users",err:err});
     }else{
        res.status(200).json({status:true,msg:"List populated",data:result});
     }
  });
 }