Mongodb:不能使用字符串字段名称附加到数组

时间:2014-12-19 12:55:16

标签: javascript node.js mongodb mongoose database-schema

我正在尝试使用$ push推进子阵列但是得到了一个Mongo错误,并且在google上进行了大量搜索之后无法完成此操作,并且findOneAndUpdate没有成功,因此我使用了find并单独更新< / p>

{ [MongoError: can't append to array using string field name: to]
name: 'MongoError',
err: 'can\'t append to array using string field name: to',
code: 13048,
n: 0,
lastOp: { _bsontype: 'Timestamp', low_: 2, high_: 1418993115 },

架构:

var NetworkSchema = new Schema({

UserID: {
    type: Schema.Types.ObjectId,
    ref: 'User'
},
NetworkList: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
}],

NetworkRequest: [{
    from: [{
    type:Schema.Types.ObjectId,
        ref: 'User'
}],
    to: [{
        type: Schema.Types.ObjectId,
        ref: 'User'
    }]
}]

});

文件:

{
"UserID" : ObjectId("549416c9cbe0e42c1adb42b5"),
"_id" : ObjectId("549416c9cbe0e42c1adb42b6"),
"NetworkRequest" : [ 
    {
        "from" : [],
        "to" : []
    }
],
"NetworkList" : [],
"__v" : 0
}

控制器:

exports.update = function(req,res) {
var network = req.network;
var query={'UserID':req.body.UserID};
var update = {$push:{'NetworkRequest.to': req.body.FriendID}};

Network.find(query,function(err){
    if (err) {
        console.log(err);
        return err;
    } else {

    }
});

Network.update(query,update,{upsert:true},function(err,user){
    console.log(user);
    if (err) {
        console.log(err);
        return err;
    } else {

        console.log('User'+user);
    }
});
};

2 个答案:

答案 0 :(得分:1)

您的查询var query={'UserID':req.body.UserID};标识您要修改的文档。然后,您需要另一个查询来识别NetworkRequest数组中哪个对象应该被推入UserID。如下所示:

var query = { 
       'UserID':req.body.UserID,
       'NetworkRequest._id': ObjectId(someNetworkRequestId)
};

然后使用此更新查询包含$,它是嵌套数组中对象的索引(NetworkRequest)

var update = {
         $push:{
            'NetworkRequest.$.to': req.body.FriendID
         }
};

答案 1 :(得分:1)

@cbass在答案中说的一切都是正确的,但由于你的NetworkRequest元素中没有唯一的标识符,你需要按位置进行:

var query = {'UserID': req.body.UserID};
var update = {$push:{'NetworkRequest.0.to': req.body.FriendID}};
Test.update(query, update, {upsert: true}, function(err, result) { ... });

'NetworkRequest.0.to'标识to数组第一个元素的NetworkRequest字段。