【问题标题】:How to save nested array in MongoDB using Mongoose and NodeJS如何使用 Mongoose 和 NodeJS 在 MongoDB 中保存嵌套数组
【发布时间】:2017-03-09 18:35:10
【问题描述】:

谁能解释我如何使用 mongoose 和 nodejs 将嵌套数组项保存到 mongodb 中?。

这是我正在使用的架构。

var demoSchema = ({
    "r_id": Number,
    "r_label": String,
    "entity": [{
        "d_label": String,
        "d_type": String
      }
    ]
})

这是我用来将数据保存到数据库中的 Nodejs 函数

 app.route("/mypages/rooms")
  .post(function(req, res) {
   var db = mongoOp.demo();
   var response = {};
   req.checkBody("r_id", "Enter a valid r_id address.").notEmpty();
   req.checkBody("r_label", "Enter a valid label address.").notEmpty();

   var errors = req.validationErrors();
   if (errors) {
     console.log(errors);
     console.log(req.body);
     res.status(500);
     res.end('500 Server Error');
     //res.render('addrooms',{flag:1});
     return;
     } else {
         db.r_id = req.body.r_id;
         db.r_label = req.body.r_label;
         db.entity = req.body.entity;
         db.save(function(err) {
          if (err) {
           findfromdb(req, res, 2); //own function for implementation purpose
          } else {
           findfromdb(req, res, 1);
          }
        });
        //var middleVar = req.body.resources;
      //  console.log(middleVar[0].d_rgb);
     }
 });

【问题讨论】:

    标签: node.js mongodb mongoose-schema


    【解决方案1】:

    用数组[]设置实体

    db.entity = [{}];

    app.route("/mypages/rooms")
      .post(function(req, res) {
       var db = mongoOp.demo();
       var response = {};
       req.checkBody("r_id", "Enter a valid r_id address.").notEmpty();
       req.checkBody("r_label", "Enter a valid label address.").notEmpty();
    
       var errors = req.validationErrors();
       if (errors) {
         console.log(errors);
         console.log(req.body);
         res.status(500);
         res.end('500 Server Error');
         //res.render('addrooms',{flag:1});
         return;
         } else {
             db.r_id = req.body.r_id;
             db.r_label = req.body.r_label;
             db.entity = [{
                          "d_label": req.body.label_type,
                          "d_type": req.body.d_type
                         }];
             db.save(function(err) {
              if (err) {
               findfromdb(req, res, 2); //own function for implementation purpose
              } else {
               findfromdb(req, res, 1);
              }
            });
            //var middleVar = req.body.resources;
          //  console.log(middleVar[0].d_rgb);
         }
     });
    

    下面的操作如果元素label_typed_type在数组中不存在,则将它们添加到实体数组中,如果存在则不添加

    https://docs.mongodb.com/manual/reference/operator/update/addToSet/

    Model.update(
        query, //  { _id: 1 }
        {
            $addToSet: {
                "enity": {
                    "d_label": req.body.label_type,
                    "d_type": req.body.d_type
                }
            }
        }
    )
    

    看看这个答案

    Pushing item to Mongodb collection array

    【讨论】:

    • 你能帮忙找出更新相同架构的方法吗?假设我已经有一个 d_label 和 d_type,我需要再更新一个条目。
    • 是的,你必须使用$addToset,我应该更新我的答案并为$addToset添加另一种方法
    • 是的,会有用的
    • 您是要向实体添加新对象还是只执行更新,我的意思是会在数组中添加更多带有 d_label 和 d_type 的实体 {}
    • 我只会添加更多实体。
    猜你喜欢
    • 2020-10-22
    • 2021-08-13
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2017-06-26
    • 2014-11-09
    相关资源
    最近更新 更多