Мангуст не приносит никаких результатов - PullRequest
0 голосов
/ 21 мая 2018

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

let query = {
            publicationType: req.body.searchParams.publicationType
        };
        if (req.body.searchParams.address) {
            query.address = {};
            if (req.body.searchParams.address.city) {
                query.address.city = req.body.searchParams.address.city;
            }
        }
        try {
            const dwellings = await model.Dwelling.find({
                $and: [{$or: [{publicationType: req.body.searchParams.publicationType}]},
                    {
                        $or: [{
                            address: [query.address]
                        }]
                    }]
            }).lean().exec();
            console.log(dwellings);
            res.send({dwellings});
        } catch (err) {
            next(err);
        }
    });

Это должно было попробовать, если параметр city работает, если я ищу только по типу публикации, я получаю желаемые результаты, если я добавляю город, я получаю 0 результатов, даже когдаЯ должен получить больше, я отладил Мангуст, чтобы посмотреть, как строится запрос, и это так:

Mongoose: dwelling.find({ '$and': [ { '$or': [ { publicationType: 'Venta' } ] }, { '$or': [ { address: { '$in': [ { city: 'La Plata' } ] } } ] } ] }, { fields: {} })
[]

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

так что, руководствуясь Дрю Маклиннисом, я понял, как заставить его работать хотя бы

const query = {};
        if (req.body.searchParams.publicationType !== '') {
            query['publicationType'] = req.body.searchParams.publicationType;
        }
        if (req.body.searchParams.address) {
            if (req.body.searchParams.address.streetNumber !== undefined) {
                query['address.streetNumber'] = req.body.searchParams.address.streetNumber;
            }
            if (req.body.searchParams.address.streetName !== undefined) {
                query['address.streetName'] = req.body.searchParams.address.streetName;
            }
            if (req.body.searchParams.address.city !== undefined) {
                query['address.city'] = req.body.searchParams.address.city;
            }
            if (req.body.searchParams.address.state !== undefined) {
                query['address.state'] = req.body.searchParams.address.state;
            }
            if (req.body.searchParams.address.country !== undefined) {
                query['address.country'] = req.body.searchParams.address.country;
            }
            if (req.body.searchParams.address.zip !== undefined) {
                query['address.zip'] = req.body.searchParams.address.zip;
            }
        }
        if (req.body.searchParams.price) {
            if (req.body.searchParams.price.min !== undefined) {
                query['price'] = {$gt: req.body.searchParams.price.min};
            }
            if (req.body.searchParams.price.max !== undefined) {
                query['price'] = {$lt: req.body.searchParams.price.max};
            }
        }
        try {
            const dwellings = await model.Dwelling.find({
                '$and': [
                    query
                ]
            }).lean().exec();
            console.log(dwellings);
            res.send({dwellings});
        } catch (err) {
            next(err);
        }

это можно оптимизировать?

0 голосов
/ 21 мая 2018

В вашем коде вы создаете выражения $ и из двух $ или выражений , но каждоеВыражение $ или имеет только один аргумент каждый, поэтому вы эффективно создаете это выражение $ и find (обратите внимание, я использую синтаксис оболочки mongo ниже):

db.dwellings.find({ 
   '$and': [ 
       { publicationType: 'Venta' }, 
       { address: { '$in': [ { city: 'La Plata' } ] } } 
   ]
});

... на словах: "найди жилье с публикациейТип Venta и address.city La Plata.

, если я добавлю городЯ получаю 0 результатов, даже когда я должен получить больше

Поскольку вы упоминаете, что ожидаете получить больше результатов, когда добавляете address.city Я подозреваю, что вы действительно хотите, чтобы выражение верхнего уровня было$or не $and, например:

db.dwellings.find({ 
   '$or': [ 
       { publicationType: 'Venta' }, 
       { address: { '$in': [ { city: 'La Plata' } ] } } 
   ]
});

Возможно, вы захотите поэкспериментировать с вашим запросом в оболочке mongo перед тем, как выразить его в виде кода. Если на вашей рабочей станции есть Docker.Я считаю, что запуск mongo в контейнере полезен для создания прототипов при разработке, например:

docker run --name mongo -d mongo:3.7
# after mongo is up and running...
docker exec -it mongo mongo

В intВ оболочку eractive mongo вы можете вставить документы для тестирования и эксперимента с выражениями find, например:

use stackoverflow;
dwell1 = { publicationType: 'Venta', address: { city: 'Somewhere' } };
dwell2 = { publicationType: 'Something', address: { city: 'La Plata' } };
db.dwellings.insert(dwell1);
db.dwellings.insert(dwell2);

# Try results of $and
db.dwellings.find({ '$and': [ 
   { publicationType: 'Venta' }, 
   { address: { '$in': [ { city: 'La Plata' } ] } } 
]  });

# ... compare to results of $or
db.dwellings.find({ '$or': [ 
   { publicationType: 'Venta' }, 
   { address: { '$in': [ { city: 'La Plata' } ] } } 
]  });

... после того, как вы вставили несколько документов для тестирования, подтвердите, хотите ли вы $and или $or выражение в вашем find.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...