Mongoose中的多文档Upsert

3

你好,以下是我的问题:

var poolSchema = mongoose.Schema({
        "topic_id": {
            type: Number,
            default: null,
            required: true
        },
        "document_id": {
            type: String,
            default: null,
            required: true
        },
        "project":{
            type:String,
            default: false,
            required: true
        },
        "createddate":{
            type:Date,
            default : Date.now
        }
    }, { collection: "sorguHavuzu" }); 

我有一个池文档的数组,每个项都有不同的字段值,如下所示:
var poolItems = [
                   {document_id :"FBIS3-50136" ,topic_id :"301" , project :"A1"},
                   {document_id :"LA040190-0178" ,topic_id :"302" , project :"A1"},
                   {document_id :"FT934-5418" ,topic_id :"303" , project :"A1"},
                   {document_id :"LA071090-0047" ,topic_id :"304" , project :"A1"}]

这是我的方案:

我想通过文档ID字段来更新数组中的项目。所以这是我的更新操作。

var query = {"document_id" : { $in:["FBIS3-50136","LA040190-0178","FT934-5418","LA071090-0047"]}};
Pools.collection.update(query, { $push : { "$ROOT" :  poolItems }  }, { upsert: true, multi : true}, callback);

错误:在\'$ROOT\'中以美元符号($)为前缀的字段\'$ROOT\'对于存储无效。

但是,每次尝试时都会出现不同的错误,有没有一种方法可以使用mongoose更新操作来插入或更新项目?谢谢。


你想根据 document_idpoolItems 中的项目 upsert 到 pools 集合中吗? - Talha Awan
是的,@TalhaAwan,这是正确的。 - erkan çipil
@TalhaAwan,有什么想法吗? - erkan çipil
这回答解决了你的问题吗?尝试使用Mongoose进行批量upsert,最干净的方法是什么? - Mir-Ismaili
1个回答

3
批量插入更新并不像在这里所提到的那样可行,但是有一种可能的解决方案。然而,你可以考虑使用更简单的方法,为每个poolItems使用upsert操作和promise或一些async方法,比如each。下面的代码应该有效:
var async = require('async');
var Pool = require('/path/to/pool.js');

var poolItems = [
{document_id :"FBIS3-50136" ,topic_id :"301" , project :"A1"},
{document_id :"LA040190-0178" ,topic_id :"302" , project :"A1"},
{document_id :"FT934-5418" ,topic_id :"303" , project :"A1"},
{document_id :"LA071090-0047" ,topic_id :"304" , project :"A1"}];

async.each(poolItems, function(poolItem, callback){
    Pool.findOneAndUpdate({document_id: poolItem.document_id}, poolItem, {upsert:true}, function(err, doc){
        if(err){
         return callback(err);
        }
        return callback();
    });
}, function(err){
    if(err){
        console.log(err);
    }
    else{
        console.log("All pool items have been upserted!")
    }
});

我本来是这么想的,但考虑到性能问题,列表实际上相当庞大。你觉得这样做还好吗? - erkan çipil
我认为这是一个合理的方法。列表有多大? - Talha Awan
至少40个项目 - erkan çipil
没什么的,我想了无数个 :) 就去做吧。 - Talha Awan
改变的方法是什么?通过for循环更新多少个文档被认为太多? - Hemal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接