簡體   English   中英

Mongodb:無法使用字符串字段名稱追加到數組

[英]Mongodb: Can't append to array using string field name

我正在嘗試使用$ push推入一個子數組內部,但出現Mongo錯誤,並且在google上進行大量搜索后無法通過此方法,並且findOneAndUpdate沒有成功,所以我分別使用了find和update

{ [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);
    }
});
};

您的查詢var query={'UserID':req.body.UserID}; 標識要編輯的文檔。 然后,您需要另一個查詢來標識應將UserID推送到NetworkRequest數組中的哪個對象。 如下所示:

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

然后使用包含$更新查詢,該$是嵌套數組中對象的索引(NetworkRequest)

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

@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陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM