我正在使用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时,我得到了“保存在付款收款中的数据”,但是我的付款收款中没有输入这些条目。
答案 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)
}
}
希望有帮助