Как получить данные из 3 коллекций в Mongodb с помощью узла JS? - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть следующие коллекции в mongodb

db.orders.find()

{ "_id" : ObjectId("5cc69ad493297eade15bacb7"), "item" : "card", "qty" : 15, "user_mob" : 8220097 }
{ "_id" : ObjectId("5cc69adf93297eade15bacb8"), "item" : "card1", "qty" : 11, "user_mob" : 8220097 }

db.items.find()

{ "_id" : ObjectId("5cc69ba493297eade15bacbc"), "item" : "card1", "color" : "blue", "weight" : "50g" }
{ "_id" : ObjectId("5cc69bb793297eade15bacbd"), "item" : "card", "color" : "yellow", "weight" : "60g" }
{ "_id" : ObjectId("5cc69bd193297eade15bacbe"), "item" : "ball", "color" : "multi color", "weight" : "140g" }
{ "_id" : ObjectId("5cc69be793297eade15bacbf"), "item" : "footer", "color" : "Black", "weight" : "340g" }
{ "_id" : ObjectId("5cc69c0c93297eade15bacc0"), "item" : "caps", "color" : "multi color", "weight" : "250g" }

db.users_nippon.find()

{ "_id" : ObjectId("5cadf1d9b0a2d18bdc6de90a"), "name" : "hariharan", "mobile_no" : "8220097", "role_id" : "2", "language_code" : "ml", "encrypted_password" : "password_Passw0rd", "is_salesman" : "true", "is_mobile" : "true" }

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

db.collection('users_nippon').aggregate([
            {
                $lookup: {
                   from: "orders",
                   localField: "mobile_no",
                   foreignField: "user_mob",
                   as: "orders_data"
                }
            },
            {
                $unwind: "$orders_data"
            },
            {
                $lookup: {
                    from: "items",
                    localField: "item",
                    foreignField: "item",
                    as: "items_data"
                }
            },
            {
                $unwind: "$items_data"
            }
        ]).toArray(function(err, list) {
            if (err) throw err;
            console.log(JSON.stringify(list));
            res.send(JSON.stringify(list));
            });

Что-то пошло не так. Возвращает пустой ( [] ).

Итак, пожалуйста, помогите мне решить эту проблему ... Заранее спасибо.

Ниже приведен пример для выхода, который я хочу

[
{
    "_id": "5cc67e439c26e35a70fddfd5",
    "name": "hariharan",
    "mobile_no": "8220097",
    "role_id": "2",
    "language_code": "ml",
    "encrypted_password": "password_Passw0rd",
    "is_salesman": "true",
    "is_mobile": "true",
    "orders_data": {
        "_id": "5cc6ebe9f4c1d9080b93b013",
        "item": "card",
        "qty": 15,
        "user_mob": "8220097",
        "items_data": {
                "_id": "5cc69bb793297eade15bacbd",
                "item": "card",
                "color": "yellow",
                "weight": "60g"
          }
    }

}]

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

В вашем запросе есть 2 проблемы:

  1. Поле user_mob (схема заказов) - Number, а mobile_no (схема user_nippon) - Stringпоэтому поиск не может быть сделан.Возможно, вы захотите использовать один и тот же тип для этих полей.

  2. Второй lookup неверен.первые lookup и unwind возвращают ваш элемент item внутри элемента orders_data, поэтому localField этого lookup следует изменить на: orders_data.item

Таким образом, после того, как вы измените оба типа user_mob и mobile_no на соответствующие типы, ваш запрос будет выглядеть следующим образом:

db.collection('users_nippon').aggregate([
            {
                $lookup: {
                   from: "orders",
                   localField: "mobile_no",
                   foreignField: "user_mob",
                   as: "orders_data"
                }
            },
            {
                $unwind: "$orders_data"
            },
            {
                $lookup: {
                    from: "items",
                    localField: "orders_data.item",
                    foreignField: "item",
                    as: "items_data"
                }
            },
            {
                $unwind: "$items_data"
            }
        ]).toArray(function(err, list) {
            if (err) throw err;
            console.log(JSON.stringify(list));
            res.send(JSON.stringify(list));
            });

1 голос
/ 30 апреля 2019

Необходимо изменить тип данных mobile_no в коллекции users_nippon с string на NumberLong, иначе $lookup не будет работать.После исправления теперь вы можете использовать запрос агрегации ниже, чтобы получить желаемый результат в том же формате, что и вы.

db.collection('users_nippon').aggregate([

        {
            $lookup: {
              from: "orders",
              localField: "mobile_no",
              foreignField: "user_mob",
              as: "orders_data"
            }
        },
        {
            $unwind: "$orders_data"
        },
        {
            $lookup: {
                from: "items",
                localField: "orders_data.item",
                foreignField: "item",
                as: "orders_data.items_data"
            }
        },
        {
            $unwind: "$orders_data.items_data"
        }
    ]).toArray(function(err, list) {
        if (err) throw err;
        console.log(JSON.stringify(list));
        res.send(JSON.stringify(list));
        });

это проверенное и рабочее решение.

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