如何将一个集合的数据传输到mongodb的另一个集合

时间:2020-05-08 18:24:27

标签: mongodb typescript postman nestjs

我正在使用nestjs。我有两个集合,一个集合在订单中,第二个集合是付款,我想从订单集合中检索一个条目,并将同一条目保存到付款集合中。

这是服务代码:

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 个答案:

答案 0 :(得分:1)

我认为问题就在这行

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)
    }
}

希望有帮助

相关问题