【问题标题】:How can I make a multiple options query with mongodb driver for nodejs?如何使用 mongodb 驱动程序为 nodejs 进行多选项查询?
【发布时间】:2019-04-26 20:14:38
【问题描述】:

我正在使用 Nodejs 进行 MongoDB 查询,但我遇到了无法解决的问题。

假设我们在 Mongo 中有很多文档,每个文档都有一个标签数组

tags: [tag1, tag2, tag3]

前端将发送参数,我们想用这些参数进行查询......我怎样才能在 Mongo 中找到带有这些标签的每个文档。标签可以不同,并非所有文档都具有相同的标签,但我想提取几乎具有这些标签之一的每个文档。我不知道我是否清楚这一点,但我希望你能帮助我。

PD:如果查询有效,我可以应用超过 13 个,因此它需要类似于动态查询。

问候

【问题讨论】:

  • 我没用Mongoose,我用的是mongodb驱动

标签: arrays node.js mongodb express


【解决方案1】:

这就是 mongodb 的聚合函数发挥作用的地方

假设有一个名为 books 的数据库,我们想要获取其类型中包含让我们说 ['fantasy', 'sci-fi'] 的书

db.book.aggregate([{
   $match:{
     genres:{
      $in:['fantasy', 'sci-fi']
      }
   }
}])

这将得到你想要的结果,找到所有包含幻想或科幻的书籍

db.book.aggregate([{
   $match:{
     genres:{
      $all:['fantasy', 'sci-fi']
      }
   }
}])

这将获得所有类型为奇幻和科幻的书籍

db.book.aggregate([{
   $match:{
     genres:{
      $nin:['fantasy', 'sci-fi']
      }
   }
}])

这将获取所有没有这些值的书

【讨论】:

    【解决方案2】:

    根据参数在你的代码中生成$or条件:

    let or_array = [];
    params.forEach(params, (tag_param) => {
           or_array.push({tags: tag_param})
         });
    let or_cond = {$or: or_array};
    

    现在我们只需要一个简单的查找查询来检索文档:

      let results = model.find(or_cond); 
    

    结果应该包含想要的文件。

    ** 请注意 $or 需要一个非空数组,因此您应该验证至少从客户端接收到一个参数。

    【讨论】:

    • 我会试试的,假设它可以与 mongodb 驱动程序一起使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多