Как перенести данные одной коллекции в другую на mongodb - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над гнездом js. У меня есть две коллекции: одна в заказах, а вторая - оплата, и я хочу получить одну единственную запись из коллекций заказов и сохранить ту же запись в коллекции платежей.

Вот код служб:

async order(name){
    const list=this.usersmodel.find({name:name}).exec()
    //return list
    try{
        if(list){
            const x=this.usersmodel.aggregate([
                {$out:"payment"}
            ])
            return "data saved in payment collection"
        }
    }
    catch(error){
        return(error.message)
    }
}

Вот код контроллера:

@Get('orderdata')
async orderdata(@Body('name')name){
    return this.usersService.order(name)
}

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

1 Ответ

1 голос
/ 09 мая 2020

Думаю, проблема здесь, в этой строке

const list = this.usersmodel.find({ name: name }).exec()

это блок кода asynchronous, поэтому следующие строки будут выполняться без ожидания разрешения этого списка

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

const list = await this.usersmodel.find({ name: name }).exec()

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

, поэтому вам нужно добавить стадию $ match в ваш агрегированный конвейер, чтобы добавить список заказов с указанным вами именем

также обратите внимание, что нам также требуется await в совокупности, так как это асинхронный блок кода, поэтому подождите, пока это агрегирование не будет выполнено, затем выполните оператор return

, чтобы вся функция выглядит примерно так:

async order(name) {
    const list = await this.usersmodel.find({ name: name }).exec()
    //return list
    try {
        if(list){
            await this.usersmodel.aggregate([ // note the await here
                { $match: { name: name } }, // filtering the orders
                { $out: "payment" } // move them to the payment collection
            ])

            return "data saved in payment collection"
        }
    }
    catch (error) {
        return(error.message)
    }
}

надеюсь, это поможет

...