【问题标题】:Adding Objects to Array of Objects in a Document using Mongoose.js使用 Mongoose.js 将对象添加到文档中的对象数组
【发布时间】:2017-06-09 20:21:52
【问题描述】:

我查看了stackoverflow,但没有找到答案。我正在尝试将对象添加到本地 mongodb 中不重复的新(空)数组中。我还想用其他对象更新这个数组。

我查看了 $push 和 $addToSet,这些示例使用了一个 "id" (_id),在我添加我的第一个对象之前不会创建它。

我正在使用 Node.js、Mongoose.js、Mongodb、Express.js。

我的架构是:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var barSchema = new Schema({
    location: [{
           name: String,
           city: String,
           total: Number
              }]     
           });
var Bar = mongoose.model('Bar', barSchema);
module.exports = Bar;

我试过用这个;

       var newBar = bar({ 
           location: [{ "name": req.body.bar, "city": req.body.city, "total": 0 }] });
           newBar.save(function(err) {
              if (err) throw err;
        });

我也成功使用了 $push,但在这种情况下,我没有 "id"

        user.findByIdAndUpdate(req.user._id, { $push: { 
                               barlist: { "name": req.body.bar, 
                                          "rsvp": true } } },           
                                 function(err, user) { });

这回馈了这个;

     {
      "_id" : ObjectId("######"),
      "location" : [
       {
           "name" : "1st Bar",
           "city" : "Boston",
           "total" : 0,
           "_id" : ObjectId("#########")
        }
                ],
         "__v" : 0
      }
     {
      "_id" : ObjectId("######"),
      "location" : [
       {
           "name" : "2nd Bar",
           "city" : "Boston",
           "total" : 0,
           "_id" : ObjectId("#########")
        }
                ],
         "__v" : 0
      }

但是我想得到这个;

      {
      "_id" : ObjectId("#######"),
      "location" : [
        {
           "name" : "Biddy Early's",
           "city" : "Boston",
           "total" : 0
        },
        {
           "name" : "Some Bar Name",
           "city" : "Boston",
           "total" : 0
        }
                  ]
      }

【问题讨论】:

  • 如果您不想在位置对象中使用_id,请在您的架构中添加_id: falselocation: [{name: String, city: String, total: Number, _id: false }]
  • 谢谢 Tarush 我不知道我能做到这一点。然而,这并不是我所关注的。虽然我以后会记住这一点。感谢您的帮助。

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

请知道可能有更好的方法可以做到这一点,但是...在这种情况下,您要做的第一件事是创建架构的新实例或'model'。根据您的代码外观,您可能需要考虑这样的事情;

        var newBar = bar({
            "city": req.body.city,
            location: [{
                "bar": req.body.bar,
                "total": 0
            }]
        });
        newBar.save(function(err) {
            if (err) throw err;
        });

如果您正在寻找同一城市的酒吧或餐馆,您可能希望有一个“.find()”或“.update()”的通用键/值对,具体取决于您想用它做什么.

从这里,您将需要查看您之前使用 '$addToSet' 提到的内容,这样您就不会将重复的条形添加到您的 'location' 数组中。比如说;

        bar.findOneAndUpdate({'city':req.body.city}, 
              {'$addToSet': { location: { 
                                 'bar': req.body.bar, 'total': 0 } } },
                        function(err, b) {
                            if (err) throw err;
                                console.log(b);
                            });

考虑使用 if/else 之类的策略来确定城市名称是否存在,如果存在,则使用“$addToSet”。否则,如果它不存在,您将像我使用的示例一样使用新模型。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2022-01-13
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多