Как я могу увеличить вложенные значения Dynami c? - PullRequest
2 голосов
/ 28 марта 2020

У меня есть свободно созданная база данных с ключом website. В этом website объекте у меня будет несколько объектов, по одному для каждого динамически создаваемого веб-сайта. Примером того, как может выглядеть база данных, будет

website: {
    google.com: {
        count: 19,
        like: {huge: 9, normal: 10},
        follow: {big: 11, small: 8}
    },
    facebook.com: {
        count: 1,
        like: {huge: 1},
        follow: {big: 1}
    }
}

Таким образом, веб-сайты изначально являются пустым объектом, и чем больше будет происходить, тем больше случайных веб-сайтов будет добавлено (например, Google, Facebook)

Теперь я хочу, чтобы значения внутри были увеличены на 1, когда я получаю совпадение с этими значениями, например,

User.findByIdAndUpdate({"_id": id}, {
website: {
    [query.name]: { $inc : { //query.name is the dynamic name that'll be given
        count: 1, //I want this count value incremented by one
        like: {
            [query.like]: 1 //query.like would be either huge or normal or something that's not available yet, in which case it would be created with a value of 1. If it exists I want the value incremented by one.
        },
        follow: {
            [query.follow]: 1 //query.follow would be either big or small or something that's not available yet, in which case it would be created with a value of 1. If it exists I want the value incremented by one.
        }
    }}
}
}, function(err, result){
    if (err) {
        console.log(err);
    } else {
        console.log(result);
    }
});

Но это не работает, я получаю сообщение об ошибке «Ошибка: Поле с префиксом доллара ($) $ in c in на сайте. [Dynami c имя сайта]. $ in c 'недопустимо для хранилища. "

Я попытался поместить $ в c в нескольких других местах, но я получил примерно такое же сообщение.

Есть идеи? (

1 Ответ

2 голосов
/ 28 марта 2020

Вы должны использовать точечную запись, когда хотите сослаться на вложенные поля, чтобы ваш код JS выглядел следующим образом:

let query = { name: "google.com", like: "huge", follow: "big" };

let update = {
   $inc: {
      [`website.${query.name}.count`]: 1,
      [`website.${query.name}.like.${query.like}`]: 1,               
      [`website.${query.name}.follow.${query.follow}`]: 1
   }
}

console.log(update);

Вы можете попробовать, если это работает. Проблема в том, что вы используете точки в качестве имен вложенных документов (google.com, facebook.com). Вопрос в том, сможет ли MongoDB идентифицировать это имя ключа google.com вместо { google: { com: ... } }. Я бы предложил удалить эти точки из имен полей. Вы можете использовать подчеркивание вместо точки, как google_com - это будет намного безопаснее.

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