我正在尝试使用带有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
。任何帮助将不胜感激。
谢谢
答案 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
操作:
- 创建一个临时集合。
- 从现有副本中复制索引 收集到临时集合。
- 将文档插入到 临时集合。
- 使用以下命令调用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阶段。并且,请首先使用不同的临时集合或通过删除$ out阶段并检查聚合管道的结果来仔细检查输出值。
有关详细信息,请阅读Official $out MongoDB documentation.