Как перенести несколько данных из одной коллекции в другую с помощью агрегирования $ out - PullRequest
0 голосов
/ 09 мая 2020

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

Вот код услуги:

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

1 Ответ

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

согласно документации, $out заменяет всю коллекцию, если она существует, той, которую вы предоставили, поэтому, когда вы это сделаете, она заменит старую

, если ваша mongodb версия составляет> 4,2, вы можете использовать $merge вместо

в $merge, он добавляет новый документ в коллекцию, если он существует, также вы можете определить поведение, если новый документ уже существует (сохраните старый или перезаписать), и если он не существует (вставьте или проигнорируйте его)

, вы можете увидеть все это в документации $ merge здесь

также вы можете найти сравнение между $ out и $ 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)
    }
}

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

...