【问题标题】:Mongoose relation not working both ways猫鼬关系不能双向工作
【发布时间】:2015-04-01 04:25:13
【问题描述】:

我的应用程序(使用 yeoman angular-fullstack 生成器构建)中的 Rides 和 Comments 控制器之间无法运行关系。

评论模型:

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

var CommentSchema = new Schema({
  name: String,
  comment: String,
  active: Boolean,
  ride: { type: mongoose.Schema.Types.ObjectId, ref: 'Ride' }
});

module.exports = mongoose.model('Comment', CommentSchema);

骑行模型:

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

var RideSchema = new Schema({
  name: String,
  distance: String,
  climb: String,
  rating: String,
  active: Boolean,
  comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

module.exports = mongoose.model('Ride', RideSchema);

访问 /api/cmets/ 给了我一个正确的结果,其中包含一个相关的 Ride:

{"_id":"54ce818f8c2889da58b01e19","name":"NAAM","comment":"COMMENT","ride":"54ce69647a78532057aa98e0","__v":0}]

访问 /api/rides/ 给我以下结果,没有相应的评论:

[{"_id":"54ce69647a78532057aa98e0","name":"Ride test ingevuld","distance":"4000","climb":"1200","rating":"1","__v":0,"comments":[]}]

谁能告诉我我做错了什么?

【问题讨论】:

    标签: express mongoose mean-stack


    【解决方案1】:

    就我而言,它不是那样工作的。你的 cmets 得到了它的骑行,你的骑行得到了它的 cmets。我认为,你应该删除

    ride: { type: mongoose.Schema.Types.ObjectId, ref: 'Ride' }
    

    并将 cmets 保存在骑行集合中。

    comments: ['Comment']
    

    这是更客观的解决方案,因为它应该是为客观(分层)数据设计的 MONGO DB。

    【讨论】:

    • 感谢您的回答,但不幸的是它似乎并没有解决我的问题。也许我的控制器不正确 ($http.post('/api/cmets', { name: 'NAAM', comment: 'COMMENT', Ride: $scope.id});) ?
    • 我会这样做: 1. 使用 $push(读取 moongose $push)骑乘服务器控制器 addCommentToRide,这会将评论对象推送到骑乘对象。然后将自己的服务器路由添加到此 POST 操作。然后,您可以通过 $http 从角度发布您的评论,例如{comment:commentObject,rideId:yourRideId}
    【解决方案2】:

    来自我的一个项目的示例:

    exports.insertRoom = function(req, res) {
    var id =  req.body.id;
    
    var r =  req.body.room;
    var room = new Room({name: r.name});
    
    Floor.update(
        {_id : id},
        {
            $push: { rooms: room}
        },
        {upsert:true},
        function(floor, err)
        {
                res.sendStatus(200);
        }
    );
    

    };

    【讨论】:

    • 它几乎可以工作.. 除了我的 ng-repeat 没有更新(刷新更新包含 cmets 的列表)。在我的控制器中,我有:exports.addCommentToRide = function(req, res) { var id = req.params.id; var c = req.body.comment; var comment = new Comment({name: c.name}); Ride.update({_id : id}, { $push: { comments: comment} }, {upsert:true}, function(ride,err){ return res.json(200, ride); } ); };
    • 如果您的数据保存正确,请签入数据库。如果是这样,您必须再次从服务器读取集合以刷新数据,并将此集合保持在您的范围内,并且每个成功的帖子都将相同的数据添加到您的本地数组中。确保您从服务器收到带有 cmets 的游乐设施,您可以在 google chrome 检查器的“网络”选项卡中查看它,它会显示您来自服务器的所有请求和响应
    猜你喜欢
    • 2020-12-01
    • 2018-07-22
    • 2014-06-15
    • 2014-04-23
    • 2018-05-02
    • 2017-05-26
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多