Как сбросить объекты с объектов - PullRequest
2 голосов
/ 02 мая 2019

Это мой документ:

{
    "_id" : ObjectId("5ccaa152feee5f2e60dff06f"),
    "name" : "ABC",
    "hobbies" : {
        "cricket" : {
            "hobbyName" : "cricket"
        },
        "football" : {
            "hobbyName" : "football"
        }
    }
},
{
    "_id" : ObjectId("5ccaa196feee5f2e60dff070"),
    "name" : "D",
    "hobbies" : {
        "Tennis" : {
            "hobbyName" : "Tennis"
        },
        "Volleyball" : {
            "hobbyName" : "Volleyball"
        },
        "basketball" : {
            "hobbyName" : "basketball"
        }
    }
}

var find = [ "Tennis", "football"];

Над моим документом под объектом hobbies предположим, что есть значение для тенниса и футбола, я хочу сбросить этот конкретный объект

Мой код:

var find = [ "Tennis", "football"];
db.Hobbies.find({})
.forEach(function(doc){
    var _id = doc._id;
    for(let i=0;i<find.length;i++){ 
    let remove  = find[i];
    let concate = "hobbies." + remove;
    let text = '"'+concate+'"';
        db.Hobbies.update(
            {'_id': _id},
            {$unset: { text : {_id: remove} }} 
        )
    }
})

Мой ожидаемый результат:

 {
    "_id" : ObjectId("5ccaa152feee5f2e60dff06f"),
    "name" : "ABC",
    "hobbies" : {
        "cricket" : {
            "hobbyName" : "cricket"
        }
    }
},
{
    "_id" : ObjectId("5ccaa196feee5f2e60dff070"),
    "name" : "D",
    "hobbies" : {
        "Volleyball" : {
            "hobbyName" : "Volleyball"
        },
        "basketball" : {
            "hobbyName" : "basketball"
        }
    }
}

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Прочитайте немного об операторе $ unset . В основном вам нужно указать имя поля для сброса. Правильный фрагмент должен выглядеть следующим образом:

db.Hobbies.update(
    {'_id': _id},
    {$unset: { "hobbies.Tennis": "", "hobbies.footbal": ""}, 
)

также, если вы хотите удалить все увлечения теннисом и футболом:

db.Hobbies.update(
    {},
    {$unset: { "hobbies.Tennis": "", "hobbies.footbal": ""}, 
    {multi: true}
)

РЕДАКТИРОВАТЬ: динамический путь.

let find = [ "Tennis", "football"];
db.Hobbies.find({})
    .forEach(function(doc){
       var _id = doc._id;
       let unset_obj = {};
       for(let i=0; i < find.length; i++){ 
            let key = `hobbies.${find[i]}`;
            unset_obj[key] = "";
        }
        db.Hobbies.update(
            {'_id': _id},
            {$unset: unset_obj} 
        )
    }
})

динамически обрабатывает все документы:

let find = [ "Tennis", "football"];
var _id = doc._id;
let unset_obj = {};
for(let i=0; i < find.length; i++){ 
    let key = `hobbies.${find[i]}`;
    unset_obj[key] = "";
}
db.Hobbies.update(
            {},
            {$unset: unset_obj},
            {multi: true}
        )
    }
})
0 голосов
/ 02 мая 2019

Не зацикливаться на db.Hobbies.find ({}).попробуйте прямо:

    var find = [ "Tennis", "football"];
    for(let i=0;i<find.length;i++){ 
    let remove  = find[i];
    let concate = "hobbies." + remove;
    console.log(concate)
        db.Hobbies.update({},{$unset:{concate : 1}},{multi : true} 
        )
    }

это сбросит все документы, а также пропустит цикл и запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...