首页 > 解决方案 > 如何将键/值对数组更新为猫鼬?

问题描述

背景:我有一组从 Vue Axios 发送的对象。这些对象是存储在 req.body 中的键值对。

请求体

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

注意:我可以期望收到一个 req.body ,其中包含数组中的大量对象。如果不添加 [] 或 req.body.keyValue[0],我无法访问对象中的“键”和“值”。

如何在不必显式调用特定对象的情况下将每个对象的“键”和“值”动态添加到猫鼬中?

我正在尝试做这样的事情:(尝试失败)

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);
    }
  })
}

我希望我能够解释得足够好。让我知道是否有任何混淆。谢谢!

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


这里的重点是,当您调用req.body.keyValue.keyand时req.body.keyValue.value,它们位于一个 javascript 数组req.body.keyValue[]中。

假设req.body.keyValue将始终是一个有效的数组,{ key : '...', value : '...' }您可以使用MongoDB $each 运算符来更新您的文档。

作为:

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 }
  ]
}

推荐阅读