Искать в нескольких коллекциях мангуст - PullRequest
2 голосов
/ 12 марта 2019

У меня около 15 коллекций (разных провайдеров с разной структурой данных), у которых есть несколько общих полей, скажем, название, описание и цена .

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

Можно ли сделать запрос для всех 15 коллекций одновременно, используя эти общие поля? Проблема выполнения их один за другим - это проблемы с производительностью (мне приходится опираться на результаты)и тот факт, что над ним есть нумерация страниц.

Я думал о создании общей коллекции с общими полями, я думаю, немного поздно.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Согласно документации mongo, $ lookup может объединять только одну внешнюю коллекцию.

Что вы можете сделать, это объединить userInfo и userRole в одну коллекцию, поскольку предоставленный пример основан на схеме реляционной БД.Mongo - это база данных noSQL - для этого требуется другой подход к управлению документами.

Ниже приведен двухэтапный запрос, в котором userInfo объединяется с userRole - создается новая временная коллекция, используемая в последнем запросе для отображения комбинированных данных.В последнем запросе есть возможность использовать $ out и создать новую коллекцию с объединенными данными для последующего использования.

создать коллекцию

db.sivaUser.insert(
{    
"_id" : ObjectId("5684f3c454b1fd6926c324fd"),
    "email" : "admin@gmail.com",
    "userId" : "AD",
    "userName" : "admin"
})

 //"userinfo"
db.sivaUserInfo.insert(
{
"_id" : ObjectId("56d82612b63f1c31cf906003"),
"userId" : "AD",
"phone" : "0000000000"
})

//"userrole"
db.sivaUserRole.insert(
{
"_id" : ObjectId("56d82612b63f1c31cf906003"),
"userId" : "AD",
"role" : "admin"
})

совокупная коллекция

db.sivaUserInfo.aggregate([
{$lookup:
    {
       from: "sivaUserRole",
       localField: "userId",
       foreignField: "userId",
       as: "userRole"
    }
},
{
    $unwind:"$userRole"
},
{
    $project:{
        "_id":1,
        "userId" : 1,
        "phone" : 1,
        "role" :"$userRole.role"
    }
},
{
    $out:"sivaUserTmp"
}
])

db.sivaUserTmp.aggregate([
{$lookup:
    {
       from: "sivaUser",
       localField: "userId",
       foreignField: "userId",
       as: "user"
    }
},
{
    $unwind:"$user"
},
{
    $project:{
        "_id":1,
        "userId" : 1,
        "phone" : 1,
        "role" :1,
        "email" : "$user.email",
        "userName" : "$user.userName"
    }
}
])
0 голосов
/ 12 марта 2019

Невозможно выполнить один запрос для нескольких коллекций, но вы все равно можете сделать это, параллельно выполнить все запросы и дождаться получения всех результатов, а затем вы можете отправить общий результат в ответ.

Код должен выглядеть примерно так:

var promises = [];
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());
promises.push(Collection1.find({title : "title",desription : "description",...}).lean().exec());

Promise.all(promises).then(results=>{
    // results[0] will have docs of first query
    // results[1] will have docs of second query
    // and so on...

    // you can combine all the results here and send back in response
}).catch(err=>{
    //handle error here
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...