【问题标题】:Mongoose dynamic query in find with $in is not working使用 $in 查找的 Mongoose 动态查询不起作用
【发布时间】:2019-04-29 14:17:21
【问题描述】:

我正在使用 Node.js 和 Mongoose 5+ 在数据库中动态构建查询。变量filterField 是字段名称,filterValues 是一个数组。所以,我的代码是这样的:

if (req.currentUser.activePage) {
    queryParam['pageId'] = req.currentUser.activePage;
    if (filterField && filterValues)
        queryParam[filterField] = { $in: filterValues };
    query = Model.find(queryParam);
    console.info(queryParam);
}
Model.paginate(query, options, async (err, result) => {
    if (err) {
        res.status(500).json({ message: err.errmsg });
    } else {
        res.status(200).json(result.docs);
    }
});

打印出来的queryParam如下:

{ pageId: '123', id: { '$in': [ 1, 2 ] } }

如果我直接在 Mongo shell 中运行这个查询,它就可以正常工作。

但是,当我在 Mongoose 中运行此查询时,当 id: {$in .. 存在时,它不会返回任何内容。

什么是错误?

【问题讨论】:

  • 您能否更新您的问题以显示您的模型的架构以及您希望查询返回的示例文档?
  • @JohnnyHK,我检查了更长的代码,发现问题出在我与 Mongoose 一起使用的插件上,即 mongoose-paginate。我在没有这个插件的情况下测试了查询,它运行良好。感谢您显示更多代码的提示,因为我看到我没有使用纯猫鼬。

标签: javascript node.js mongodb mongoose


【解决方案1】:

你给Model.paginate()方法传递了错误的参数查询,试试这个方法:

if (req.currentUser.activePage) {
    queryParam['pageId'] = req.currentUser.activePage;
    if (filterField && filterValues){ 
        queryParam[filterField] = { '$in': filterValues };
    }
    Model.paginate(queryParam, options, async (err, result) => {
      if (err) {
        res.status(500).json({ message: err.errmsg });
       } else {
        res.status(200).json(result.docs);
       }
    });
}

【讨论】:

  • 请解释一下你写的代码,对以后的访问者有帮助。
  • 这里有什么不同?我看到的唯一变化是 $in'$in' 在 JS 中的处理方式相同。
  • 此代码与问题中的代码完全相同。请注意,$in 运算符也被转换为 '$in'
【解决方案2】:

我发现错误是由mongoose-paginate 插件引起的。因此,如果您将此插件与 Mongoose 一起使用,请注意传递给查询的参数。

在我的例子中,使用$in 选项将数组作为过滤器传递不适用于mongoose-paginate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2013-09-18
    • 2014-12-29
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多