如何用猫鼬将一个数组文档的值复制到另一文档

时间:2019-07-05 22:43:05

标签: node.js mongodb mongoose set hapijs

我正在尝试使用带有nodejs的mongoose将一个数组文档的数据复制到另一个数组文档。数组文档的项目具有对另一个集合的引用/ objectId。我使用$set来检索此功能,如下所示:

var criteria = {
     mId: {
        $in: ["id1", "id2", "id3"]
     }
};
var options = {
    multi: true
}

var dataToSet = {
    $set : {
       destinationDocument : "$sourceDocument",
    }
}
table_name.update(criteria, dataToSet, options, function(err,result){
        if(err) {
           console.log(err)
        }
    });

但是我遇到以下错误:

Cast to [ObjectId] failed for value "["$sourceDocument"]" at path "destinationDocument"

我的数据库架构如下

new Schema({
    idAutoIncrement: { type: Number,unique: true,index:true,sparse:true},
    destinationDocument: [{
        type: Schema.Types.ObjectId,
        ref: "Users",
    }],
    sourceDocument: [{
        type: Schema.Types.ObjectId,
        ref: "Users",
    }],
});

有人可以帮我弄清楚我需要做什么才能将sourceDocument的所有值复制到destinationDocument。任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:0)

var arrayOfDocuments = [documentId1, documentId2, documentId3];

arrayOfDocuments.foreach(function(documentId) {

    var criteria = {
        mId: documentId
    };

    // Get column2 from a document
    const documentColumnTwo = await table_name.findById(documentId).select('column2');

    // Set column1 to column2
    var dataToSet = {
        $set : {
            'column1' : documentColumnTwo,
        }
    }

    // Update the document
    await table_name.update(criteria, dataToSet, options, function(err, result) {
        if(err) {
            console.log(err)
        }
    });
})

答案 1 :(得分:0)

您可以将聚合管道与$ out一起使用以更新同一集合。

但是在使用$out时要小心。根据mongodb的官方文档:

  

创建新收藏集

     

如果$out操作尚不存在,则在当前数据库中创建一个新集合。的   直到聚合完成,集合才可见。如果   聚合失败,MongoDB不会创建集合。

     

替换现有集合

     

如果$out操作指定的集合已经存在,则完成   聚合,$out阶段自动替换了现有的阶段   收集新的结果集合。具体来说,$out   操作:

     
      
  1. 创建一个临时集合。
  2.   
  3. 从现有副本中复制索引   收集到临时集合。
  4.   
  5. 将文档插入到   临时集合。
  6.   
  7. 使用以下命令调用db.collection.renameCollection   dropTarget:true,以将临时集合重命名为目标   收集。
  8.   
     

$out操作不会更改存在于   以前的收藏。如果聚合失败,则执行$out操作   不会对现有集合进行任何更改。

尝试一下:

table_name.aggregate([{
    $match : {
        mId: {
            $in: ["id1", "id2", "id3"]
        }
    }
},{
    $project : {
        idAutoIncrement: "$idAutoIncrement",
        destinationDocument: "$sourceDocument",
        sourceDocument: "$sourceDocument"
    }
},{
    $out : "table_name"
}])

别忘了进入集合中所需的$ project阶段。并且,请首先使用不同的临时集合或通过删除$ out阶段并检查聚合管道的结果来仔细检查输出值。

有关详细信息,请阅读Official $out MongoDB documentation.