MongoDB:将字段移动到新文档并更新字段和数组

mongodb: moving field to new document and update fields and array

本文关键字:字段 文档 更新 数组 移动 新文档 MongoDB      更新时间:2023-09-26
Collection.find({ $and: [ {title: { $exists: true}}, {reference: { $exists: true }} ]}).pretty()

这给了我一些带有结构的文档:

{
    "_id" : "EJBFtZ7EeGbBPwJaw",
    "title" : "title",
    "reference" : "8uujF9pivpGA37oQc",
    "parent" : "v7DJzq859XX4kvKPi",
    "ancestors" : [
        "v7DJzq859XX4kvKPi"
    ]
}

现在我必须以这种方式转换所有文档:

  1. 将标题移动到新文档,然后
  2. parent ID 更新为新文档
  3. 将新 ID 推送给祖先(在第一个位置!

结果应该是:

{
    "_id" : "gzRn4nDKfeewb8EYE",    // new document
    "title" : "title",              // moved title
    "parent" : "v7DJzq859XX4kvKPi",
    "ancestors" : [
        "v7DJzq859XX4kvKPi"
    ]
},
{
    "_id" : "EJBFtZ7EeGbBPwJaw",    // removed title
    "reference" : "8uujF9pivpGA37oQc",
    "parent" : "gzRn4nDKfeewb8EYE", // update parent id to new id
    "ancestors" : [
        "gzRn4nDKfeewb8EYE",        // add new id at first pos
        "v7DJzq859XX4kvKPi"
    ]
}

所以我想到的是这样的:

Collection.find({ $and: [ {title: { $exists: true}}, {reference: { $exists: true }} ]}).forEach(function(doc) {
    // get data from source
    var id     = doc.id;
    var title  = doc.title;
    var parent = doc.parent;
    // insert new document
    var newId = Collection.insert({
        title: title,
        parent: parent,
        ancestors: [parent]
    });
    // update source document
    if (newId) {
        Collection.update(
            { _id: id },
            { 
                $set:   { parent: newId },   // update parent id
                $push:  { ancestors: newId } // update ancestors array
                $unset: { title: '' }        // remove title
            }
        );      
    }
});
  1. 但是执行$push将附加 id 而不是在它前面。
  2. 使用if (newId) {}是否正确,还是应该将此部分放在insert的回调函数中?

如果有任何可能的改进,请告诉我。

1) 尝试$position变量 https://docs.mongodb.org/master/reference/operator/update/position/#up._S_position

2)就个人而言,我会做与MongoDB插入方法相同的操作,返回创建的新_ID。

问候