如何使用 $out 聚合将多个数据从一个集合传输到另一个集合

How to transfer multiple data from one collection to another using $out aggregation

我正在使用 nestjs,我有两个集合,一个是订单,第二个是付款。现在我需要从托收订单中检索一个文档并将其保存到正常工作的付款托收中,但问题是当我尝试将第二个文档保存到付款托收中时我的第一个文档被覆盖了。换句话说,提交第二份文件后,第一份文件就消失了。我想保存我从订单文档中检索到的付款集合中的每个文档。

这里是服务代码:

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

控制器代码-:

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

根据文档,$out 正在用您提供的那个替换整个集合(如果存在),所以当您这样做时,它将替换旧的

如果您的 mongodb 版本 > 4.2,您可以使用 $merge

$merge 中,如果新文档存在,它会将其添加到集合中,如果新文档已经存在(保留旧文档,或覆盖它)并且如果存在,您还可以定义行为不存在(插入或忽略它)

您可以在 $merge here

的文档中看到所有这些内容

您还可以找到 $out and $merge here

之间的比较

在您的代码中,它应该类似于

async order(name) {
    const list = await this.usersmodel.find({ name: name }).exec()
    //return list
    try {
        if(list) {
            const x = await this.usersmodel.aggregate([
                { $match: { name: name } },
                { $merge: { into: "payment" } } // you can define other options here like if the document already exists, keep the old one or not and so on, all of that you can find in the documentation
            ])
            return "data saved in payment collection"
        }
    }
    catch(error){
        return(error.message)
    }
}

希望对您有所帮助