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

Typescript 如何使用$out聚合将多个数据从一个集合传输到另一个集合,typescript,postman,aggregate,lookup,nestjs,Typescript,Postman,Aggregate,Lookup,Nestjs,我在nestjs上工作,我有两个系列,一个是订单,第二个是付款。现在我需要从收款单中检索一个文档并将其保存到正常工作的付款托收中,但问题是当我尝试将第二个文档保存到付款托收中时,我的第一个文档被覆盖。换句话说,在提交第二个文档后,第一个文档已消失。我想保存从订单文档检索到的付款托收中的每个文档 以下是服务代码: async order(name){ const list=await this.usersmodel.find({name:name}).exec() //return

我在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
中,如果新文档存在,它会将其添加到集合中;如果新文档已经存在(保留旧文档,或覆盖旧文档),以及如果新文档不存在(插入或忽略它),您也可以定义行为

您可以在的文档中看到所有这些

此外,您还可以找到

在代码中,它应该是

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

希望它有帮助

现在一切正常,我还有一个问题,我想存储多个文档,比如假设我已经从集合1保存了集合2中的文档1、文档2、文档3、文档4,并且出现了这样的情况,我需要再次在集合2中保存从集合1获取的相同文档1。我的收藏中没有相同文档的重复条目。你如何做到这一点。你能提供解决方案吗?如果你需要覆盖现有的单据1,那么使用
{$merge:{into:“payment”,在:“\u id”上,当匹配时:“replace”}
。。。。如果您需要保留当前版本,请在“\u id”上使用
{$merge:{into:“payment”,如果匹配:“keepExisting”}
。。。如果您需要将新的合并到现有的合并中,请使用
{$merge:{into:“payment”,在:“\u id”上,在匹配时使用:“merge”}
。。。阅读文档了解更多信息不,我不想将新文档合并到现有文档中。如果同一文档已经存在,我需要一次又一次地添加该文档。假设我已经在集合2中保存了文档\ 1,然后在集合\ 2中保存了文档\ 2,现在我需要在集合\ 2中再添加一个文档文档\ 1。我使用了你之前评论的第三个查询,但输出仍然保持不变。为了更清楚,你可以检查这个-