Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongodb:用另一个ObjectID全局替换对一个ObjectID的所有引用?_Javascript_Mongodb_Mongo Shell - Fatal编程技术网

Javascript mongodb:用另一个ObjectID全局替换对一个ObjectID的所有引用?

Javascript mongodb:用另一个ObjectID全局替换对一个ObjectID的所有引用?,javascript,mongodb,mongo-shell,Javascript,Mongodb,Mongo Shell,所以我有一个MongoDB数据库,在几个集合中有数百万条记录。下面是一些记录的(大大简化)示例 集合A文档看起来像: { _id: ObjectID(....) name: "Hubert Humphrey" } { _id: ObjectID(....) ReferenceSummary: [ { person: ObjectID(<some-ID-from-Collection-A>) count: 312 },

所以我有一个MongoDB数据库,在几个集合中有数百万条记录。下面是一些记录的(大大简化)示例

集合A文档看起来像:

{ 
  _id: ObjectID(....)
  name: "Hubert Humphrey"
}
{
  _id: ObjectID(....)
  ReferenceSummary: [
    { 
      person: ObjectID(<some-ID-from-Collection-A>)
      count: 312
    },
    { 
      person: ObjectID(<some-other-ID-from-Collection-A>)
      count: 42
    },
    ...
  ], 
  TopPeople: [ ObjectID(<another-ID-from-Collection-A>), ObjectID(<yet-another-ID-from-Collection-A>), ...]
}
集合B文档看起来像:

{ 
  _id: ObjectID(....)
  name: "Hubert Humphrey"
}
{
  _id: ObjectID(....)
  ReferenceSummary: [
    { 
      person: ObjectID(<some-ID-from-Collection-A>)
      count: 312
    },
    { 
      person: ObjectID(<some-other-ID-from-Collection-A>)
      count: 42
    },
    ...
  ], 
  TopPeople: [ ObjectID(<another-ID-from-Collection-A>), ObjectID(<yet-another-ID-from-Collection-A>), ...]
}
{
_id:ObjectID(…)
参考摘要:[
{ 
个人:ObjectID()
总数:312
},
{ 
个人:ObjectID()
计数:42
},
...
], 
TopPeople:[ObjectID(),ObjectID(),…]
}
现在问题来了。我们意识到我们在收藏a中有一些副本(只有3或4个),而它们在收藏B中被引用了数十万次

但是,不存在给定集合B文档引用两个彼此重复的不同集合a文档的情况

因此,我需要做的是:对于集合A中的每一对副本,使用
\u id
ObjectId(X)
ObjectId(Y)
,将集合B中所有文档中出现的
ObjectId(Y)
替换为
ObjectId(X)

如果我处理的是原始JSON文件,我只需要做一个字符串替换就可以了


在mongo shell中,有没有一种简单的方法可以做到这一点,只需对每个集合a重复使用一个命令?

完成这项工作的最简单的方法是使用
forEach
循环

var ids = [id1, id2, ...., idN];
var idsToReplace = [id1TR, id2TR, ...., IdNTR];
var aLenght = ids.lenght;

for (var i = o; i < aLenght; i++) {
    db.collectionA.find({
        _id : ids[i]
    }).forEach(function (doc) {
        doc.fieldA = idsToReplace[i];
        // if we habve an array entry we need to iterate thru it
        var arrayXLenght = doc.arrayX.lenght;
        for (var j = 0; j < arrayXLenght; j++) {
            if (doc.arrayX[j].field === ids[i]) {
                doc.arrayX[j].field = idsToReplace[i];
            }
        }

        prinjson(doc); //verify changes
        //doc.save() //uncoment when you wil be assured that changes are ok
    })

    // same thing with other collection
}
varids=[id1,id2,…,idN];
var idstorerece=[id1TR,id2TR,…,IdNTR];
var aLenght=ids.lenght;
for(var i=o;i
完成这项工作最简单的方法是使用
forEach
循环

var ids = [id1, id2, ...., idN];
var idsToReplace = [id1TR, id2TR, ...., IdNTR];
var aLenght = ids.lenght;

for (var i = o; i < aLenght; i++) {
    db.collectionA.find({
        _id : ids[i]
    }).forEach(function (doc) {
        doc.fieldA = idsToReplace[i];
        // if we habve an array entry we need to iterate thru it
        var arrayXLenght = doc.arrayX.lenght;
        for (var j = 0; j < arrayXLenght; j++) {
            if (doc.arrayX[j].field === ids[i]) {
                doc.arrayX[j].field = idsToReplace[i];
            }
        }

        prinjson(doc); //verify changes
        //doc.save() //uncoment when you wil be assured that changes are ok
    })

    // same thing with other collection
}
varids=[id1,id2,…,idN];
var idstorerece=[id1TR,id2TR,…,IdNTR];
var aLenght=ids.lenght;
for(var i=o;i
我假设此人是重复的-您是否有办法选择重复项(这是通过id字段或其他元数据实现的?)这只是由手动输入错误导致的少数特定重复项。一个简单的方法可以一次替换其中一个的所有引用。我假设这个人是一个重复的人-你有办法选择重复的人吗(这是通过id字段或其他元数据?)这只是一些特定的重复,由手动输入错误引起的。一种简单的方法可以一次替换其中一个的所有引用;我希望有一个简单的命令可以替换每个实例,但听起来我确实需要手动循环;我希望有一个简单的命令可以替换每个实例,但听起来我确实需要手动循环。