在用户模型Mongoosedb中为嵌套数组添加唯一ID

时间:2015-08-04 09:21:59

标签: node.js express model mongoose

我试图在用户模型中的用户收藏夹数组中为嵌套数组添加唯一的轨道ID。新的,所以一点帮助将是伟大的

User.js(型号)

var UserSchema   = new Schema({
 name: String,
 username: { type: String, required: true, index: { unique: true }},
 password: { type: String, required: true, select: false },
 favorites: [Track],
 meta : [{
    favorites_count : {
        type: Number,
        default: 0
    },
    friends_count: {
        type: Number,
        default: 0
    }
 }]

});

apiRouter.route('/users/:user_id/favorites/:track_id')
        .post(function(req, res){
            User.findByIdAndUpdate(req.params.user_id, {
                $addToSet: {"favorites": {track_id: req.body.track_id}},
                $inc: { "meta.favorites_count": 1 }
                // $set: { "meta.favorites_count": 1}
            }, 
            {safe: true, upsert: true}, function(err, user) {

                    if (err) res.send(err);

                    res.json({ message: "Track Favorited" });

                }
            );
        })

1 个答案:

答案 0 :(得分:0)

您应该在模式中定义favorites,如下所示:

var mongoose = require('mongoose'),
    ObjectId = mongoose.Types.ObjectId;

var UserSchema = new Schema({
  name: String,
  username: { type: String, required: true, index: { unique: true }},
  password: { type: String, required: true, select: false },
  favorites: [{ type : ObjectId, ref: 'Track' }],
  meta : [{
     favorites_count : {
     type: Number,
     default: 0
   },
   friends_count: {
     type: Number,
     default: 0
   }
 }]
});

并将您的路线更改为:

apiRouter.route('/users/:user_id/favorites/:track_id')
    .post(function(req, res){
        User.findByIdAndUpdate(req.params.user_id, {
            $addToSet: {"favorites": req.body.track_id},
            $inc: { "meta.favorites_count": 1 }
            // $set: { "meta.favorites_count": 1}
        }, 
        {safe: true, upsert: true}, function(err, user) {
                if (err) res.send(err);
                res.json({ message: "Track Favorited" });
            }
        );
    });

编辑:从您的评论中回答问题。 如果您的favorites数组中已存在曲目ID,则应将查询更改为:

var track_id = req.body.track_id;

User.findOneAndUpdate({
     _id: req.params.user_id,
     favorites: {$nin: [track_id]}
  },{
     $addToSet: {"favorites": track_id },
     $inc: { "meta.favorites_count": 1 }
     // $set: { "meta.favorites_count": 1}
  },{
     safe: true,
     upsert: true
  },function(err, user) {
     if (err) res.send(err);
     res.json({ message: "Track Favorited" });
  }
);

因此,您应该在track_id数组

中排除已包含favorites的文档