Как я могу заменить небольшую часть профильного URL-пути во всех документах, запустив один запрос в mongodb? - PullRequest
0 голосов
/ 01 ноября 2018
{ 
        "_id" : ObjectId("5bd6ed6a49ba281f5c54f185"), 
        "AvatarSet" : {
            "Avatar" : [
                {
                    "IsPrimaryAvatar" : true, 
                    "ProfilePictureUrl" : "https://blob.blob.core.windows.net/avatarcontainer/avatardba36759-3e8e-4666-bc2b-e53ffb527716.jpeg?version=8b1b58b3-94f8-4608-b4db-05746eea8bfe"
                }
            ]
        }

Здесь мне нужно заменить только https://blob.blob.core.windows.net на каждый кандидат ID, присутствующий в базе данных, пожалуйста, помогите мне, как написать MongoDB Query для этого?

Я использую Query, но он не работает

db.getCollection("candidate-staging")
.find({},{"AvatarSet":[0]})..forEach(function(e) {
    e.ProfilePictureUrl= e.ProfilePictureUrl.replace("https://blob.blob.core.windows.net", "https://blob123.blob.core.windows.net");
    db.candidate-staging.save(e);
});

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

В этом коде содержатся объекты массива объекта. В этом коде достигают AvatarSet Массив, указывающий на отсутствующее поле в документе верхнего уровня, поскольку нам необходим доступ к объектам в другом массиве, поэтому нам нужно написать еще один цикл. для массива "Аватар", как e.AvatarSet.Avatar.forEach, это действительно работает. это работа для меня.

db.getCollection("test").find({}).forEach(function(e,i) {
    e.AvatarSet.Avatar.forEach(function(url, j) {
        url.ProfilePictureUrl = url.ProfilePictureUrl.replace("https://blob.blob.core.windows.net", "https://blob123.blob.core.windows.net");
        e.AvatarSet.Avatar[j] = url;
    });
    db.getCollection("test").save(e);
    eval(printjson(e));
})  

спасибо !! manfonton и stackoverflow

0 голосов
/ 01 ноября 2018

Проблема в вашем скрипте заключается в том, что ProfilePictureUrl неправильно указан, использование точечной нотации, как в примере ниже, должно решить проблему.

В вашем коде e.ProfilePictureUrl указывает на отсутствующее поле в документе верхнего уровня, в то время как doc.AvatarSet.Avatar[0].ProfilePictureUrl в следующем примере указывает на поле ProfilePictureUrl для первого элемента в массиве Avatar под полем AvatarSet из основного документа.

db.test.find({}).forEach(function(doc) {
  doc.AvatarSet.Avatar[0].ProfilePictureUrl= doc.AvatarSet.Avatar[0].ProfilePictureUrl.replace("https://blob.blob.core.windows.net", "https://blob123.blob.core.windows.net");     
  db.test.save(doc); 
});

Локальный тест:

mongos> db.test.find()
{ "_id" : ObjectId("5bdb5e3c553c271478a9a006"), "AvatarSet" : { "Avatar" : [ { "IsPrimaryAvatar" : true, "ProfilePictureUrl" : "https://blob.blob.core.windows.net/avatarcontainer/avatardba36759-3e8e-4666-bc2b-e53ffb527716.jpeg?version=8b1b58b3-94f8-4608-b4db-05746eea8bfe" } ] } }
{ "_id" : ObjectId("5bdb5e3e553c271478a9a007"), "AvatarSet" : { "Avatar" : [ { "IsPrimaryAvatar" : true, "ProfilePictureUrl" : "https://blob.blob.core.windows.net/avatarcontainer/avatardba36759-3e8e-4666-bc2b-e53ffb527716.jpeg?version=8b1b58b3-94f8-4608-b4db-05746eea8bfe" } ] } }

mongos> db.test.find({}).forEach(function(doc) {
 doc.AvatarSet.Avatar[0].ProfilePictureUrl= doc.AvatarSet.Avatar[0].ProfilePictureUrl.replace("https://blob.blob.core.windows.net", "https://blob123.blob.core.windows.net");    
 db.test.save(doc); });
mongos> db.test.find()
{ "_id" : ObjectId("5bdb5e3c553c271478a9a006"), "AvatarSet" : { "Avatar" : [ { "IsPrimaryAvatar" : true, "ProfilePictureUrl" : "https://blob123.blob.core.windows.net/avatarcontainer/avatardba36759-3e8e-4666-bc2b-e53ffb527716.jpeg?version=8b1b58b3-94f8-4608-b4db-05746eea8bfe" } ] } }
{ "_id" : ObjectId("5bdb5e3e553c271478a9a007"), "AvatarSet" : { "Avatar" : [ { "IsPrimaryAvatar" : true, "ProfilePictureUrl" : "https://blob123.blob.core.windows.net/avatarcontainer/avatardba36759-3e8e-4666-bc2b-e53ffb527716.jpeg?version=8b1b58b3-94f8-4608-b4db-05746eea8bfe" } ] } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...