Как обновить массив пар ключ / значение в mon goose? - PullRequest
0 голосов
/ 21 января 2020

Фон: У меня есть массив объектов, отправленных с Vue Ax ios. Эти объекты представляют собой пары ключ-значение, которые хранятся в req.body.

Req.body

keyValue:  [{key:"some key", value:"some value"}, {key:"some key2", value:"some value2"}]

Примечание : я могу ожидать получить req.body с множеством объектов в массиве. Я не могу получить доступ к «ключу» и «значению» в объектах без добавления [] или req.body.keyValue [0].

Как я могу динамически добавлять "ключ" и "значение" каждого объекта в mon goose без необходимости явного вызова объекта c?

Я пытаюсь сделать что-то вроде этого: (неудачная попытка)

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const Schema = new Schema({
  Pair: [{
    Key: String,
    Value: Number
  }]
});

router.post("/",  (req, res) => {
 User.update({},
  {$push:
  {Pair:{
        Key: req.body.keyValue.key,
         Value: req.body.keyValue.value
       }
      }
    }, 
  (err,result)=>{
    if(err){
      console.log(err);
      res.status(400).send('Error')
    }else{
      res.status(200).send(result);
    }
  })
}

Я надеюсь, что смог объяснить достаточно хорошо. Дайте мне знать, если есть какие-то путаницы. Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

Дело в том, что когда вы вызываете req.body.keyValue.key и req.body.keyValue.value, они находятся в javascript массиве req.body.keyValue[].

Предполагая, что req.body.keyValue всегда будет действительным массивом с { key : '...', value : '...' } вы можете использовать MongoDB $ каждый оператор для обновления вашего документа.

As:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const Schema = new Schema({
  Pair: [{
    key: String,
    value: Number
  }]
});

router.post("/",  (req, res) => {
  User.update(
    {},
    {
      $push: {
        Pair:{
          $each : req.body.keyValue
        }
      }
    }, 
    (err,result)=>{
      if(err){
        console.log(err);
        res.status(400).send('Error')
      }else{
        res.status(200).send(result);
      }
    }
  );
}

Теперь просто будьте осторожны, чтобы req.body.keyValue имел правильная прописная буква на каждом элементе, поэтому у вас нет *K*ey и / или *k*ey, которые не будут соответствовать вашей схеме. =]

Редактировать

Просто чтобы объяснить, как будет работать оператор $ each, см. Следующий пример:

req.body = {
  keyValue : [
    { key : "key1", value : 1 },
    { key : "key2", value : 2 }
  ]
};

Документ в коллекции User перед обновлением:

{
  _id : ObjectId(),
  Pair : [
    { key : "key_A", value : 99 }
  ]
}

После .update() с оператором $each ожидаемый обновленный документ:

{
  _id : ObjectId(),
  Pair : [
    { key : "key_A", value : 99 },
    { key : "key1", value : 1 },
    { key : "key2", value : 2 }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...