关于node.js:Mongoose findOne方法检索缺少_id的有效文档

Mongoose findOne method retrieves valid document with missing _id

我目前遇到一个非常奇怪的猫鼬错误,但我不知道是什么导致了此问题。当我调用findOne方法时,我得到一个有效的实例,只有_id字段未初始化。当我尝试将更改保存在该文档中时,它会崩溃

1
2
3
4
5
6
7
8
{ [CastError: Cast to ObjectId failed for value"[object Object]" at path"_id"]
 message: 'Cast to ObjectId failed for value"[object Object]" at path"_id"',
 name: 'CastError',
 type: 'ObjectId',
 value:
   { from_node_id: 52e10f6acce9daa7f3bf3162,
     target_id: 'a' },
 path: '_id' }

我有一个简单的架构定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var transitionProbabilitySchema;
transitionProbabilitySchema = new Schema({
   _id: {
       from_node_id: {type: Schema.Types.ObjectId, ref:"Zone"}
   },
   value: {
       total_transition_count: Number,
       probabilities: [
           {to_node_id: {type: Schema.Types.ObjectId, ref:"Zone"}},
           {probability: Number}
       ]}
}, {collection: 'transitionProbability'});

module.exports = mongoose.model('transitionProbability', transitionProbabilitySchema);

当我现在打电话

1
2
3
4
5
6
7
8
TransitionProbability.findOne({"_id.from_node_id": from_node_id},
        function (err, tp) {
            if (err) {
                handleError('error - tp not found', err, callback);
            } else {
                 // some modification of tp and then save
            }
        }

猫鼬返回文档,但仅_id未初始化。当我尝试保存更改后的文档时(而不是之前),整个功能崩溃。我还将文档记录到控制台以验证它只是缺少" _id"字段。

PS:请注意,from_node_id是从另一个查询中提取的,并且是有效的ObjectId

有任何想法吗?在此先感谢您的帮助!

编辑:手动设置_id字段似乎也不起作用。甚至更有趣:尝试其他方法时,我认识到例如findOneAndUpdate确实冻结了整个node.js应用程序,没有任何日志。它只是不会继续。


编辑:供您参考:在连续两天没有找到答案的情况下,我在Mongoose.js Github上创建了一张可能存在错误的故障单,他们确认了我的问题。 根据他们的说法,它在新的4.0.0版本候选版本中得到修复,不建议将其用于生产用途。 在实际上解决了我的问题,但是rc1提出了更多问题。

到目前为止,我的解决方案:

最终,我对这个错误感到非常恼火,以至于我更改了该表的整个累积量,以致_id没有单独的from_node_id字段。 我现在直接使用from_node_id作为ID。