【问题标题】:Mongodb: Can't append to array using string field nameMongodb:无法使用字符串字段名称附加到数组
【发布时间】:2015-02-18 10:11:48
【问题描述】:

我正在尝试使用 $push 推入子数组,但出现 Mongo 错误,在谷歌上进行大量搜索后无法通过此操作,并且 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);
    }
});
};

【问题讨论】:

  • 不确定这是否是唯一的问题,但NetworkRequest 在您的架构中被定义为一个对象,但在您的文档中它是一个数组。另外,为什么Network.find 会在那里打电话?
  • 抱歉,NetworkRequest 是 Schema 中的一个数组,我现在编辑了问题,猫鼬 findOneAndUpdate 在我使用此功能时不起作用,没有显示错误,但我无法将值附加到我的数据库中的数组,所以我分别使用了 Network.find 和 Network.update,它工作得很好,直到 MongoDb 的这个错误显示为控制台,请帮助我,我希望你理解我的情况,如果没有,那么我会给你详细解释一下
  • 不需要Network.find 调用。只需将其删除。
  • 好的!我做了,但仍然得到那个 mongo 错误!

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


【解决方案1】:

您的查询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
         }
};

【讨论】:

  • 不,当我使用 $ 符号时它不起作用我得到这个错误与上述错误完全不同--- MongoError:如果没有包含数组的相应查询字段,则无法应用位置运算符。---
  • 你有要推送的网络请求的 id 吗?
  • 是的,我有 id 这就是为什么我没有提到客户端控制器端代码,因为它不会导致任何错误
  • 对不起!我无法得到这行代码--'NetworkRequest._id': ObjectId(someNetworkRequestId)--你能帮我吗,我应该指什么 ObjectId(someNetworkRequestId),仅供参考,UserID 是登录用户的 ID。
  • 抱歉,现在我可以看到 NetworkRequest 没有 Id。这使得推动非常困难。但我不明白为什么 NetworkRequest 是一个数组。你没有任何东西可以证明它。
【解决方案2】:

@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' 标识NetworkRequest 数组的第一个元素的to 字段。

【讨论】:

  • 感谢您的回答!你能告诉我如何在同一个 UPDATE 函数中更新两个具有不同 ObjectID 的不同文档吗?
  • @shaileshshekhawat 最好将其作为一个单独的问题发布。
  • 好的,我在这里问了这个问题:-stackoverflow.com/questions/27582112/…
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2015-12-23
  • 2014-07-05
相关资源
最近更新 更多