【问题标题】:how to copy values of one array document to another document in mongoose如何将一个数组文档的值复制到猫鼬中的另一个文档
【发布时间】:2019-07-06 15:03:03
【问题描述】:

我正在尝试使用 mongoose 和 nodejs 将一个数组文档的数据复制到另一个数组文档。数组文档的项目具有对另一个集合的引用/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。任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 你用的是哪个版本的mongodb?

标签: node.js mongodb mongoose set hapijs


【解决方案1】:
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)
        }
    });
})

【讨论】:

  • 感谢您快速回复雷蒙德。但我正在寻找不同的东西。让我们从行和列的角度来考虑它。我的匹配标准可能有多行(请参阅已编辑问题中的标准)而不是单行,并且对于每一行,我想用同一行的 column2 的值更新该行的 column1 的值。所以我想要猫鼬相当于以下 sql 语句:UPDATE table_name SET column1 = column2 WHERE mid IN ('id1', 'id2', 'id3')。注意:在我的例子中,column1column2 是一个引用不同集合的项目数组。
  • 看看我更新的答案。它遍历一个 id 数组,对于每个 id,它会找到文档并将值从 column2 复制到 column1。
【解决方案2】:

您可以使用带有 $out 的聚合管道来更新同一个集合。

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

创建新收藏

$out 操作会在当前数据库中创建一个新集合(如果尚不存在)。这 在聚合完成之前,集合是不可见的。如果 聚合失败,MongoDB 不会创建集合。

替换现有集合

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

  1. 创建一个临时集合。
  2. 从现有的索引复制 集合到临时集合。
  3. 将文档插入到 临时收集。
  4. 调用 db.collection.renameCollection dropTarget: true 将临时集合重命名为目标 收藏。

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

试试这个:

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

不要忘记收藏中你需要的 $project 阶段。请先仔细检查输出值,或者使用不同的temporary_collection,或者只是删除$out阶段并检查聚合管道的结果。

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

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多