老实说,这让我发疯了。这是问题所在:
我在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做错了吗?
任何帮助将不胜感激 - 谢谢! 亨利
答案 0 :(得分:1)
mongodb中的现有文档与架构之间存在不匹配。您的数据包含flwng._id
是String的记录,这就是您在mongo shell中获得结果的原因。但是您的mongoose模式将其定义为ObjectId
,因此当您使用mongoose进行查询时,mongoose会将您的字符串值强制转换为ObjectId
并且查询不匹配。编写迁移来修复现有数据,或者根据String vs ObjectId数据类型更新模式以匹配您的数据,并且事情应该通过mongoose开始工作。