MongoDB обновляет вложенный объект в зависимости от ввода json - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть данные JSON, которые структурированы в следующей форме:

[
{"size":100,"year":2015,"geography":"London","age":"21","gender":"Female"},
{"size":80,"year":2015,"geography":"Cardiff","age":"38","gender":"Male"},
{"size":80,"year":2013,"geography":"Edinburgh","age":"36","gender":"All"}
]

И я пытаюсь добавить его в коллекцию базы данных со следующей схемой:

const Schema = new Schema({
  geography: String,
  size: {
    2013: {
      male: { 
        age: {

        }
      } 
      female: {
        age: {

        }
      }
      all: {
        age: {

        }
      }
    }
  }
});

В настоящее время я пытаюсь настроить свое обновление следующим образом:

query = { geography : geography};
update = { geography : geography, $set: { "year.gender.age" : size}

Schema.updateOne( query, update, { upsert: true }; 

Установленный здесь $, очевидно, не работает, поскольку обновление не знает, как извлечь значения из данных json. Я попытался сделать переменные года, пола и возраста, а затем рефакторинг набора (см. Ниже), но это также не работает.

$set: { `${year}.${gender{.$age}` }

Итак, вопрос в том, как я могу использовать значения в моих данных JSON, чтобы определить, какое встроенное поле обновить?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Лучшим вариантом здесь была бы другая схема, которая не является динамической, как предложено в этом ответе .

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

Например, если у вас есть объект типа

const obj = {
    "size": 100,
    "year": 2015,
    "geography": "London",
    "age": "21",
    "gender": "Female"
}

чтобы преобразовать его в объект обновления вида

{
    "geography": "London",
    "2015.female.21": 100
}

требуется следующая карта:

const obj = {
    "size": 100,
    "year": 2015,
    "geography": "London",
    "age": "21",
    "gender": "Female"
}

const doc = Object.keys(obj).reduce((acc, curr) => {
    if (curr === "geography") {
        acc["geography"] = obj[curr];
        return acc;
    };

    switch(curr) {
        case "year":
        case "gender":
        case "age":
            acc[`${obj['year']}.${obj['gender'].toLowerCase()}.${obj['age']}`] = obj['size']

    }
    return acc;

}, {});

console.log(JSON.stringify(doc, null, 4));

, который затем можно использовать в операции обновления как

Model.updateOne( query, { '$set': doc }, { upsert: true }, callback );
0 голосов
/ 18 сентября 2018

, чтобы создать такой объект {"size":100,"year":2015,"geography":"London","age":"21","gender":"Female"}

Я думаю, вам нужно установить схему на:

const Schema = new Schema({
  geography: String,
  size: Number,
  year,: String,
  gender: String,
  age: String
});

Затем для обновления используйте что-то вроде:

update = { {$and: [{year:"2015"}, {age:"33"} /*and more*/]}, $set: { size : size}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...