Запрос MongoDB для двух коллекций для добавления / вычитания поля в первой коллекции с соответствующим полем из второй коллекции - PullRequest
1 голос
/ 20 февраля 2020

Я застрял на этом пару дней и, похоже, не могу понять.

Вот несколько примеров коллекций в моей базе данных MongoDB: (просто пример. Извините, если они неправильно отформатирован)

Продукты:

{
    "_id": {
        "$oid": "5e4633eaa7095f26d44a43c3"
    },
    "name": "Acrylic Frame Magnetic",
    "units: "50",
    "fbasku": "AFM-CL-0507-FBA",
    "upc": "642709233954"
},
{
    "_id": {
        "$oid": "5e4633eaa7095f26d44a43c4"
    },
    "name": "Apron Polka Dot",
    "units: "488",
    "fbasku": "APD-RD-03PC-FBA",
    "upc": "642709233961"
},
{
    "_id": {
        "$oid": "5e4633eaa7095f26d44a43c5"
    },
    "name": "Acrylic Sign Holder - 5x7",
    "units: "632",
    "fbasku": "ASH-GD-0507-FBA",
    "upc": "642709233978"
}

Транзакции:

{
    "_id": {
        "$oid": "5e44e8ed8f4cd40bd09d5ce8"
    },
    "type": "adjust",
    "fbasku": "AFM-CL-0507-FBA",
    "units": {
        "$numberInt": "25"
    },
    "comment": "example transaction"
},
{
    "_id": {
        "$oid": "5e4c9ab642c5a232042f4b67"
    },
    "type": "send",
    "fbasku": "AFM-CL-0507-FBA",
    "units": {
        "$numberInt": "75"
    },
    "comment": ""
},
{
    "_id": {
        "$oid": "5e4c9ab642c5a232042f4b69"
    },
    "type": "send",
    "fbasku": "AFM-CL-0507-FBA",
    "units": {
        "$numberInt": "5"
    },
    "comment": ""
}

Это для API REST Я пытаюсь создать, поэтому, когда я отправляю запрос, чтобы получить все продукты, я хочу:

  1. Получить объект, содержащий все продукты
  2. Просмотреть коллекцию транзакций для каждый продукт в вышеупомянутом объекте, и добавьте / вычтите единицы из перечисленного количества единиц.
  3. Дайте ответ, содержащий объект с "fbasku", и новое вычисленное количество единиц для каждого продукта.

Я застрял, когда дело дошло до всех асинхронных / ожидающих и обещающих вещей, на самом деле не понимаю

1 Ответ

0 голосов
/ 20 февраля 2020

Вы можете попробовать код ниже - это пример того, как выполнить ваше требование, используя собственный nodejs -mongodb драйвер и node.js:

const MongoClient = require('mongodb').MongoClient;

const dbConnection = async function () {
    /** Connection URL */
    const url = 'mongodb://localhost:27017/test'; // Check whether you're passing correct DB name & full formed connection string
    let client;

    try {
        /** Use connect method to connect to the Server */
        client = await MongoClient.connect(url);
        const db = client.db(); // MongoDB would return client and you need to call DB on it.
        let dbResp = await db.collection('Products').aggregate([
            {
                $lookup:
                {
                    from: "Transactions",
                    let: { fbasku: "$fbasku" },
                    pipeline: [
                        {
                            $match:
                            {
                                $expr:
                                    { $eq: ["$fbasku", "$$fbasku"] }
                            }
                        },
                        { $project: { units: 1, _id: 0 } }
                    ],
                    as: "transaction_docs"
                }
            }, {
                $project: {
                    _id: 0, fbasku: 1,
                    units: {
                        $add: [{ $toInt: '$units' }, {
                            $reduce: {
                                input: '$transaction_docs',
                                initialValue: 0,
                                in: { $add: ["$$value", "$$this.units"] }
                            }
                        }]
                    }
                }
            }
        ]).toArray();
        client.close();
        return dbResp;
    } catch (err) {
        (client) && client.close();
        console.log(err);
        throw err
    }
};

/** In general dbConnection() has to be in one config file & it needs to be imported where ever db transactions are done like below */

dbConnection().then(res => console.log('Printing at calling ::', res)).catch(err => console.log('Err at Calling ::', err));

Примечание: В этом коде есть запрос, который предполагает единицы в products - строку, поэтому мы конвертируем ее в int и добавляем значения в ( сумма единиц транзакций => intOf(units of a products) + (sum of units of all matched transactions)).

Тестовый запрос: MongoDB-Playground

...