Mongoose搜索数组子文档ObjectId不起作用

时间:2014-07-21 05:52:11

标签: node.js mongodb mongoose

老实说,这让我发疯了。这是问题所在:

我在Mongoose中运行以下查询:

s.findSubdocument=function(uid, cb)
{
     this.model('User').find({"flwng._id":uid.toString()}).select('flwng').exec(cb);
}

在以下用户架构上:

var userSchema= new mongoose.Schema(
    {
        uname:{type:String, index:{sparse:true, unique:true, dropDups:true}}, //the username
        email:String,
        pwd:{type:String},
        flwng:[{_id : {type : mongoose.Schema.ObjectId},uname : String}], //_id of users I am following
        flwrsz:Number,
        flwngsz:Number,
        feedsz:Number,
    }, {j: 1});//j:1 means guarantee it is written to the journal.

userSchema.set('autoIndex', true);
userSchema.index({"fid":1}, {sparse:true, unique:true, dropDups:true});
userSchema.index({"flwng._id" : 1});

其中uid =“53c4f16c431247694f0000a3”==>但我得到一个空阵列:(

当我在mongo shell中运行完全相同的查询时:

db.users.find({"flwng._id":"53c4f16c431247694f0000a3"});

我得到了正确的结果集。我在“flwng._id”上尝试使用和不使用索引和模式,我试图删除索引,reIndex,我现在已经没有想法了。我对Mongoose做错了吗?

任何帮助将不胜感激 - 谢谢! 亨利

1 个答案:

答案 0 :(得分:1)

mongodb中的现有文档与架构之间存在不匹配。您的数据包含flwng._id是String的记录,这就是您在mongo shell中获得结果的原因。但是您的mongoose模式将其定义为ObjectId,因此当您使用mongoose进行查询时,mongoose会将您的字符串值强制转换为ObjectId并且查询不匹配。编写迁移来修复现有数据,或者根据String vs ObjectId数据类型更新模式以匹配您的数据,并且事情应该通过mongoose开始工作。