【问题标题】:Using $push within Array in mongoose在 mongoose 的数组中使用 $push
【发布时间】:2015-02-12 15:46:32
【问题描述】:

我的 NetworkSchema 中有一个数组,我正在尝试使用 mongoose 中的 findOneandupdate 使用另一个条目进行更新

我的模型

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

var NetworkSchema = new Schema({

UserID: {
    type: String,
    default: '',
    trim: true
},
NetworkList: [{
    Fid: {

        type: Schema.ObjectId,
        ref: 'User'
    }
}]});

HTML:

<div ng-controller="AuthenticationController" style="margin-top: 50px">

<div ng-controller="NetworksController">
    <ul>

        <li ng-repeat="Network in Networkfriends">

            {{Network.firstName}}
            <button type="submit" class = "btn btn-default" data-ng-click="update(Network._id)">Add as a Friend</button>
        </li>
    </ul>
    <button type="submit" ng-click="showlist()">show</button>
</div>
</div>

网络控制器:

$scope.update = function(FriendID)
    {
        var UserID = this.authentication.user._id;
        console.log('User ID :' +UserID);
        var NetworkList = [{

            Fid: this.FriendID
        }];

        $http.post('/networks/update',{UserID: UserID, FriendID: FriendID}, $scope.credentials).success(function(response){
            console.log(JSON.stringify(response));

        });
}

Network.Server.Controller:

var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Network = mongoose.model('Network'),
    _ = require('lodash');
    util = require('util');

exports.update = function(req, res) {

var query={'UserID':req.body.UserID};


var NetworkList = [{Fid: req.body.FriendID}];
var update = {'NetworkList' :NetworkList};


Network.findOneAndUpdate(query,update,function(err){
    if (err) {
        return err;
    } else {
        NetworkList.push(req.body.FriendID);

    }
});
};

我想从 usersList 添加用户的 objectID,正如您在我的 HTML 页面中从 NetworkFriends 获得的,每当我点击 Add as a Friend按钮,我得到的是我的数据库中的一个新条目,其 ObjectID 为 NetworkFriend,我希望通过 Add as a Friend 按钮以逗号分隔多个 NetworkFriend 的 objectID

这是我的数据库中的条目

{
"NetworkList" : [ 
    {
        "Fid" : ObjectId("5486fab40bc27314276be8cf"),
        "_id" : ObjectId("548d6ed5d6994cac219f536f")
    }
],
"UserID" : "547eaaab6c39471c3f5aebb6",
"__v" : 0,
"_id" : ObjectId("548adbc8b7eac44013bf188d")

}

我的目标是:

 {
"NetworkList" : [ 
    {
        "Fid" : ObjectId("5486fab40bc27314276be8cf"),"(objectID of another friend with comma separated like this"),
        "_id" : ObjectId("548d6ed5d6994cac219f536f")
    }
],
"UserID" : "547eaaab6c39471c3f5aebb6",
"__v" : 0,
"_id" : ObjectId("548adbc8b7eac44013bf188d")

}

【问题讨论】:

    标签: mongodb express mongoose


    【解决方案1】:

    您的目标不是有效的结构。您可能想要的是一个架构,其中NetworkList 直接包含用户朋友的 ObjectId 数组:

    var NetworkSchema = new Schema({
        UserID: {
            type: String,
            default: '',
            trim: true
        },
        NetworkList: [{
            type: Schema.ObjectId,
            ref: 'User'
        }]
    });
    

    您的文档将如下所示:

    {
        "_id" : ObjectId("548adbc8b7eac44013bf188d"),
        "NetworkList" : [ 
            ObjectId("5486fab40bc27314276be8cf") 
        ],
        "UserID" : "547eaaab6c39471c3f5aebb6",
        "__v" : 0
    }
    

    然后您可以使用$push 运算符将新朋友添加到NetworkList,如下所示:

    exports.update = function(req, res) {
        var query={'UserID': req.body.UserID};
        var update = {$push: {'NetworkList': req.body.FriendID}};
    
        Network.findOneAndUpdate(query, update, function(err, doc){ ... });
    };
    

    【讨论】:

    • 非常感谢您的回答。但是当我尝试您的解决方案时,用户的 ObjectID 将转到服务器控制器但不保存在我的数据库中,这是我的 findOneandUpdate Network.findOneAndUpdate(query,update,function(err){ if (err) { return err; } else { console.log('hahahahaha'); } });你能告诉我哪里出错了吗?
    • 代替return err;,调用console.log(err);,这样您就可以看到任何错误。
    • 它通过分别使用 find 和 update 工作,你能解释一下如何在 mongoose 中使用 post save 中间件,因为我试图在保存后切换 UserID 和 FriendID。我试图使用 NetworkSchema.post('save',function(){ NetworkSchema.find({'to': this.FriendID},function(err){ if(err){ return err; } }); NetworkSchema。 update({'from': this.UserID},function(err){ if(err){ return err; } }); console.log('post save working'); });它现在正在工作,你能告诉我我哪里错了
    • 很高兴你能成功。最好将有关中间件的问题作为一个新问题发布。
    猜你喜欢
    • 2017-01-19
    • 2020-10-25
    • 2020-02-05
    • 2017-09-03
    • 2021-04-17
    • 2018-12-21
    • 2016-12-02
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多