【问题标题】:How do I partially update an array inside and object in MongoDB so the new value is added to the array如何部分更新 MongoDB 中的数组和对象,以便将新值添加到数组中
【发布时间】:2016-11-06 11:50:41
【问题描述】:

给定以下架构

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var favoriteSchema = new Schema({
dishes: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Dish'
}],
postedBy: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
}
}, {
 timestamps: true
});

var Favorites = mongoose.model('Favorite', favoriteSchema);
module.exports = Favorites;

和下面的路由器

var bodyParser = require('body-parser');
var express = require('express');
var mongoose = require('mongoose');

var Favorites = require('../models/favorites');
var Verify = require('./verify');

var favoritesRouter = express.Router();

favoritesRouter.use(bodyParser.json());
favoritesRouter.route('/')
.post(Verify.verifyOrdinaryUser, function(req,res,next){
    req.body.postedBy = req.decoded._doc._id;
    console.log('nana ' + req.body.postedBy);
    Favorites.create(req.body,function(err,fav){
        if(err) throw err;

        fav.dishes.push(req.body);
        fav.save(function(err,fa){
            if(err) throw err;
            res.json(fa);
        })
    });
});
module.exports = favoritesRouter;

每次我执行邮递员的要求时,我都会将菜肴 ID 附加到请求的正文中。

 {
   "_id": "577a996155d73cf02b0d516f"
 }

我想不出将这个 ID 插入到数组中的解决方案,而不是重新创建整个对象,数组中只有 1 个 id。我是在做错什么,还是必须做其他事情才能执行我想要的逻辑?

【问题讨论】:

  • 您正在使用req.body,就像它既是favorite 又是dish。是哪个?

标签: node.js mongoose routes mongoose-populate


【解决方案1】:

您将要查询数据库以查找先前保存的对象,附加到数组,标记为已修改,然后保存。它看起来像这样:

var bodyParser = require('body-parser');
var express = require('express');
var mongoose = require('mongoose');

var Favorites = require('../models/favorites');
var Verify = require('./verify');

var favoritesRouter = express.Router();

favoritesRouter.use(bodyParser.json());
favoritesRouter.route('/')
.post(Verify.verifyOrdinaryUser, function(req,res,next){
    req.body.postedBy = req.decoded._doc._id;
    console.log('nana ' + req.body.postedBy);
    Favorites.findById(someID, function(err, fav){
        if(err) throw err;

        fav.dishes.push(req.body);
        fav.markModified('dishes')
        fav.save(function(err,fa){
            if(err) throw err;
            res.json(fa);
        })
    });
});

您需要弄清楚如何在其中获取 ID。您可以使用动态端点:​​

favoritesRouter.use(bodyParser.json());
favoritesRouter.route('/:id')
.post(Verify.verifyOrdinaryUser, function(req,res,next){
    var someID = req.params.id
})

或者您可以搜索发布者(.find({postedBy: req.decoded._doc._id},... 而不是 .findById(someID,...)或其他内容

【讨论】:

  • 只是好奇,markModiefied 是做什么的?我从不这样做,而且效果很好:D
  • 嗯。看来我对markModified 有点过分热心了。当您直接编辑数组元素(例如fav.dishes[3] = 'PulledPork')时,您必须将它与猫鼬一起使用,当推到数组末尾时,它似乎实际上可能没有必要。有关详细信息,请参阅此处:mongoosejs.com/docs/faq.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-11-06
相关资源
最近更新 更多