【问题标题】:bluebird + mongoose error: "Can't use $__ with Array."bluebird + mongoose 错误:“不能将 $__ 与 Array 一起使用。”
【发布时间】:2015-09-11 21:54:08
【问题描述】:

我尝试使用 bluebird + mongoose 分别查询每个 Club 的 DevHiin 实例,如下代码:

DevHiin.clubs的数据结构是:

  , clubs  : [{ type: Schema.Types.ObjectId, ref: 'Club' }] 

club_M 是 Club 模式的一个实例:

  User.findOne({"_id": req.user._id})
    .populate('clubs', '-textIndex')
    .exec(function (err, user) {
    if (err) res.status(500).json(err);

    if (user.clubs) {
      var clubs_M = user.clubs;


    for (c = 0; c < clubs_M.length; c++) {
        var club_M = clubs_M[c];

        if (club_M.lst > lstDate) {

          serverData.clubs.push(club_M);

          var ciinPromise = DevHiin.find({"clubs": {$elemMatch: club_M}, "ts": {"$gt": lastSyncTime}})
            .populate('uId', '_id username', null, null)        // get necessary user info for a hiin
            .lean()
            .sort("ts")
            .limit(10)
            .execAsync();
          promises.push(ciinPromise);
        }
      }

      Promise.all(promises).then(function (ciinArrays) {
        serverData.ciinArrays = ciinArrays;
        callback(ciinArrays);

      }).catch(function (err) {
        callback(err);
      });

很遗憾,我收到以下错误信息:

"Error: Can't use $__ with Array.
at SchemaArray.castForQuery (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/schema/array.js:188:13)
at SchemaArray.cast$elemMatch (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/schema/array.js:336:23)
at SchemaArray.castForQuery (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/schema/array.js:191:19)
at module.exports (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/cast.js:196:39)
at Query.cast (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/query.js:2350:10)
at Query.find (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/query.js:999:10)
at Query.exec (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/query.js:1984:17)
at Query.tryCatcher (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/bluebird/js/main/util.js:24:31)
at Query.ret [as execAsync] (eval at <anonymous> (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/bluebird/js/main/promisify.js:1:0), <anonymous>:12:23)
at EventEmitter.<anonymous> (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/controllers/sync.js:189:18)
at EventEmitter.<anonymous> (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/node_modules/mpromise/lib/promise.js:175:45)
at emitOne (events.js:77:13)
at EventEmitter.emit (events.js:169:7)
at Promise.safeEmit (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/node_modules/mpromise/lib/promise.js:81:21)
at Promise.fulfill (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/node_modules/mpromise/lib/promise.js:94:24)
at Promise.resolve (/Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/promise.js:113:23)
at /Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/lib/query.js:1174:16
at /Users/vince-fan/WorkSpaces/MEAN/V_Starter/node_modules/mongoose/node_modules/kareem/index.js:109:16
at doNTCallback0 (node.js:408:9)
at process._tickCallback (node.js:337:13)"

这是 bluebird promise 错误,还是 mongoose 错误?我该如何解决?

【问题讨论】:

  • 在我看来,您的club_M 实例之一(您传递给$elemMatch)可能无效。

标签: node.js mongodb mongoose bluebird


【解决方案1】:

从代码看来,您正尝试对指定为查询条件表达式的数组值使用 $elemMatch 进行查询。我相信您需要使用 $in 代替,这将选择 clubs 字段的值等于指定数组中的任何值的文档,该数组由变量 club_M 存储在你的情况。因此,您的查询应如下所示:

var ciinPromise = DevHiin.find({"clubs": {"$in": [club_M._id]}, "ts": {"$gt": lastSyncTime}})

【讨论】:

  • 感谢您的回答,实际上,clubs 是 Club 模式的数组,而 club_M 是 Club 实例的实例。我不确定我的查询是否正确......我是 mongodb 的新手
  • @bolerovt 我已经用修改后的查询更新了我的答案,因为clubsObjectIds 的数组,因此您可以使用它而不是实际的俱乐部对象。
  • 好像,$in 需要一个数组,应该是 {$in: [club_M._id]} 吗?
  • 或者似乎 $in 不是查询数组字段所必需的
  • @bolerovt 你是对的,你可以将 _id 包装在一个数组中(这不是必需的),或者直接使用 club_M._id 值查询俱乐部字段。
【解决方案2】:

查询字段包含一个数组,简单的把它当作普通的字段查询。

我的固定密码:

              var ciinPromise = DevHiin.find({"clubs": club_M._id, "ts": {"$gt": lastSyncTime}})

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 2016-05-04
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多