Mongoose中的$in查询无法正常工作

3

我有一些代码看起来像这样

return courseModel.findQ({ autoReview: true}).then(function(autoCourses){
            autoCourses = _.pluck(autoCourses, '_id');

            console.log("autoCourses", autoCourses);

            return userCoursesModel.findQ({ 
                activityId: { 
                    $in: autoCourses
                }
            }).then(function(ucs) {
                var saves = [];

                console.log("ucs", ucs);

当我记录“autoCourses”时,我看到打印了几个文档,并且lodash pluck应该挑选出每个文档的_id。我确认这个工作是正确的。
我正在使用mongoose-q:

https://github.com/iolo/mongoose-q

我尝试了普通的“查找”,但没有成功。

当我执行findQ({})并查找所有文档时,我可以看到与activityId匹配的文档。例如:

autoCourses [ 55d3b57e395d0105a4828f18,
  55d4e0b8df5d4cdc23c916e2,
  55d23654642c1d05124c1ace,
  55d238b0642c1d05124c1ad2,
  55d23bb1ecce9f4b14f79c7b,
  55d257cf70721efc16db1c24,
  55d2682532eace3118376a95,
  55d2694a32eace3118376aad,

此外,当我使用findAll记录每个用户的课程活动ID时,我可以看到有匹配项:
ucs.activityId 55de1dedc7c10dfc3bf5d9ae
ucs.activityId 55d3a91d46206dde7a46ed94
ucs.activityId 55df9974d8dfddb877a372f9
ucs.activityId 55d3b57e395d0105a4828f18

这里发生了什么?为什么$in查询不起作用?
更新:
按照要求,这是用户课程模式的样子:
var UserCourseSchema = new Schema({
    activityId: {
        type: Schema.Types.ObjectId,
        ref: 'courses',
        required: true
    },

和课程

var CourseSchema = new Schema({
    autoReview: {
        type: Boolean,
        default: false
    },

创建用户课程文档:
var newUserCourse = {
                    userId : userId,
                    activityId : activity._id,
                    steps : []
                }
                // copy steps from activity
                activity.steps.forEach(function(step){
                    newUserCourse.steps.push({partId: step._id});
                })
                return UserCourses.createQ(newUserCourse);

似乎我的环境或依赖关系存在问题,因为没有人回答 :( - Doug Molineux
看起来没问题。你有检查过userCourseSchema里的数据,确保activityId被正确填充了吗? - Yuri Zarubin
activityId 的值是什么?它看起来像什么? - Yuri Zarubin
1
问题在于,由于console.log将类型强制转换为字符串,我无法确定ObjectId的typeof和字符串的typeof。您需要验证activityId是否存储为activityId: ObjectId("55d3b57e395d0105a4828f18"),并且您在$in操作中使用的数组内部对象也是ObjectId类型。 - Yuri Zarubin
1
在您的应用程序中设置 mongoose.set("debug",true),它应该显示发送到 MongoDB 的查询。这也应该显示 ObjectId 值被正确转换。下一步要检查的是使用 MongoDB shell 连接并检查集合数据。您的模式期望 ObjectId,如果查询使用了正确的转换“类型”,那么数据可能不匹配,实际上是“字符串”或其他格式。如果它们是 ObjectId 的有效十六进制字符串,则应该很容易修复。但您的下一步将是跟踪编写它们的错误代码。 - Blakes Seven
显示剩余7条评论
1个回答

0
我联系了MongoDB支持团队,发现mongoose-q使用的是旧版本的mongoose(< 4),而我的顶级依赖项是4.0.5,这导致了奇怪的行为。当我将mongoose-q更新到0.1.0和mongoose更新到4.1.6后,find函数又可以正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接