如何将键/值对数组更新为猫鼬?

时间:2020-01-20 23:38:58

标签: javascript node.js mongodb express mongoose

背景:我有一个从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);
    }
  })
}

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

2 个答案:

答案 0 :(得分:0)

这里的意思是,当您调用req.body.keyValue.keyreq.body.keyValue.value时,它们位于JavaScript数组req.body.keyValue[]中。

假设req.body.keyValue始终是{ key : '...', value : '...' }的有效数组,则可以使用MongoDB $each operator来更新文档。

为:

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

答案 1 :(得分:0)

用户架构

Apps running on Windows Containers are available only in Hyper-V Container enabled SKU.

更新代码

userId: {
    type: String
},
password: {
    type: String
},
friends: [{
    userId: String,
    followSent: Boolean,
    followAccepted: Boolean,
    followbackSent: Boolean,
    followbackAccepted: Boolean,
    inchats: Boolean
}]