запрос работает в mongoshell, но не в nodejs - PullRequest
0 голосов
/ 29 января 2020

Привет ниже - описание проблемы, с которой я сталкиваюсь запрос mongoShell

db.masters.aggregate([
        {
          $match: {
               _id: ObjectId("5e2554ec3405363bc4bf86c0")
            }
        }, {
            $lookup: {
                from: 'masters',
                localField: 'mappedVendors',
                foreignField: '_id',
                as: 'mappedVendors'
            }
        }, { $unwind: '$mappedVendors'}, { $replaceRoot: { newRoot: "$mappedVendors" } },
        { 
           $lookup:
            {
                from: "orders",
                let: { mappedVendorId: "$_id" },
                pipeline: [
                    {
                        $match: { $expr: { $eq: ["$orderCreatedBy", "$$mappedVendorId"] } }
                    },
                    { $project: { orderCreatedOn: 1, isApproved: 1 } }
                ],
                as: "orders"
            }
        },{
           $lookup:
            {
                from: "payments",
                let: { mappedVendorId: "$_id" },
                pipeline: [
                    {
                        $match: { $expr: { $eq: ["$paymentDoneBy", "$$mappedVendorId"] } }
                    },
                    { $project: { outstanding: 1 } }
                ],
                as: "payments"
            }
        },
        { $project: { name: 1, phoneNo: 1, address: 1, depotCode: 1, orders: 1, payments: 1 } }
    ]).pretty()

ответ, который я получаю в mongoshell

{
        "_id" : ObjectId("5e2555643405363bc4bf86c4"),
        "phoneNo" : 9992625541,
        "name" : "vendor4",
        "address" : "4 vendor address 4",
        "depotCode" : "D3139",
        "orders" : [ ],
        "payments" : [
                {
                        "_id" : ObjectId("5dd7aa6c31eb913a4c4a487c"),
                        "outstanding" : 300
                }
        ]
}

    {
            "_id" : ObjectId("5e2555783405363bc4bf86c5"),
            "phoneNo" : 9992625542,
            "name" : "vendor5",
            "address" : "5 vendor address 5",
            "depotCode" : "D3139",
            "orders" : [
                    {
                            "_id" : ObjectId("5e2564323405363bc4bf86c6"),
                            "isApproved" : false,
                            "orderCreatedOn" : ISODate("2020-01-20T08:26:26.812Z")
                    },
                    {
                            "_id" : ObjectId("5e27fd3da42d441fe8a89580"),
                            "isApproved" : false,
                            "orderCreatedOn" : ISODate("2020-01-15T18:30:00Z")
                    }
            ],

Этот запрос в оболочке работает, как и ожидалось, в оболочке, но когда я пытаюсь это сделать в nodejs, он возвращает пустой []. ниже приведено описание моего nodejs файла 1: Строка подключения Mongodb

const mongoose = require('mongoose')
mongoose.connect('mongodb://127.0.0.1:27017/#####App', {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify:false,
    useUnifiedTopology: true
})

ПРИМЕЧАНИЕ: ##### не мой код 2: nodejs контроллер

exports.vendorWiseIndent = async (req, res) => {
const { dealerId } = req.body
try {
    const order = await Master.aggregate([
        {
            $match: {
                _id: mongoose.Types.ObjectId(dealerId)
            }
        }, {
            $lookup: {
                from: "masters",
                localField: "mappedVendors",
                foreignField: "_id",
                as: "mappedVendors"
            },
        },
        { $unwind: "$mappedVendors" }, { $replaceRoot: { newRoot: "$mappedVendors" } },
        {
            $lookup:
            {
                from: "orders",
                let: { mappedVendorId: "$_id" },
                pipeline: [
                    {
                        $match: { $expr: { $eq: ["$orderCreatedBy", "$$mappedVendorId"] } }
                    },
                    { $project: { orderCreatedOn: 1, isApproved: 1 } }
                ],
                as: "orders"
            }
        }, {
            $lookup:
            {
                from: "payments",
                let: { mappedVendorId: "$_id" },
                pipeline: [
                    {
                        $match: { $expr: { $eq: ["$paymentDoneBy", "$$mappedVendorId"] } }
                    },
                    { $project: { outstanding: 1 } }
                ],
                as: "payments"
            }
        },
        { $project: { name: 1, phoneNo: 1, address: 1, depotCode: 1, orders: 1, payments: 1 } }
    ])


    console.log(order)
    return res.status(200).json({
        order
    });
} catch (error) {
    res.send(error);
}}

Я также попробовал его только с помощью {_id: dealerId} 3 "nodejs файл маршрутизатора

router.post("/vendorwiseindent", vendorWiseIndent.vendorWiseIndent);

ПОЧТОВОЕ ТЕЛО & url

POST: http://localhost:5002/vendorwiseindent
{
    "dealerId": "5e2554ec3405363bc4bf86c0"

}

ОТВЕТ ПОСТМЕНА:

{
    "order": []
}

У меня есть также попытался сделать это просто с помощью {_id: dealerId} теперь база данных mongodb содержит несколько коллекций, и у меня уже запущены другие API, поэтому подключенная БД верна, должна быть какая-то другая проблема, с которой этот запрос не работает nodejs или, скорее, он возвращает пустой массив в порядке: [], но запрос работает в оболочке "mon goose": "5.7.4" и версия mongodb - 4.2

1 Ответ

0 голосов
/ 29 января 2020

nodejs файлы контроллера должны быть проверены , ADD

`const mongoose = require('mongoose ')` 

вверху dealerId не преобразовывался в objectID поскольку он отсутствовал, после его добавления ответ POSTMAN равен , указанному ниже:

{
"order": [
    {
        "_id": "5e2555643405363bc4bf86c4",
        "phoneNo": 9992625541,
        "name": "vendor4",
        "address": "4 vendor address 4",
        "depotCode": "D3139",
        "orders": [],
        "payments": [
            {
                "_id": "5dd7aa6c31eb913a4c4a487c",
                "outstanding": 300
            }
        ]
    },
    {
        "_id": "5e2555783405363bc4bf86c5",
        "phoneNo": 9992625542,
        "name": "vendor5",
        "address": "5 vendor address 5",
        "depotCode": "D3139",
        "orders": [
            {
                "_id": "5e2564323405363bc4bf86c6",
                "isApproved": false,
                "orderCreatedOn": "2020-01-20T08:26:26.812Z"
            },
            {
                "_id": "5e27fd3da42d441fe8a89580",
                "isApproved": false,
                "orderCreatedOn": "2020-01-15T18:30:00.000Z"
            }
        ],
        "payments": []
    }
]

}

...