mongoose查询具有不同值的相同字段

时间:2017-03-31 17:43:39

标签: node.js mongodb express mongoose

是否有办法让用户mongoose.find({title:'some title'})使用多个值查询同一字段?例如,像mongoose.find({title:'some title', title:'some other title'})这样的内容只发送回匹配title:'some other title的文档有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:20)

您应该使用MongoDB $in运算符 -

mongoose.find({title: {$in: ['some title', 'some other title']}})

您向$in运算符提供了一个数组,它将返回所有在指定数组中具有精确标题的文档。

答案 1 :(得分:1)

如果您是根据URL查询构建的,例如:http://url.com/posts?title=one,但查询中包含多个值,则可以采用以下方法:

在查询中使用&之类的分隔符,例如http://url.com/posts?title=title&other%20title

然后将您的请求功能设置为与异步一起运行:

例如async function listPosts() {}

然后使用&分隔符来检测它是否是对多个项目的查询,并相应地设置查询。因此,对列表帖子的整个查询如下所示:

async function listPosts(req, res, next) {
  const urlParts = url.parse(req.url, true);
  const { query } = urlParts;
  // Check if URL query has & char and split into multiple query strings
  const multiQuery = async () => {
    // Return array of any query param values containing '&'
    const mQueryArr = Object.values(query).filter(i => i.indexOf('&') > -1);
    if (mQueryArr.length) {
      Object.keys(query).forEach((key) => {
        if (query[key].indexOf('&') > -1) {
          // Split strings containing '&' and set query to search multiple using
          // mongooses '$in' operator
          const queries = query[key].split('&');
          query[key] = { $in: queries };
        }
      });
    }
  };
  await multiQuery();
  Post.find(query)
    .exec((err, posts) => {
      if (err) {
        return next(err);
      }
      return res.json({ posts });
    });
}

希望这对某人有帮助,因为我花了一段时间才弄清楚了针对同一对象键进行多次查询的URL查询方法。

答案 2 :(得分:1)

在 2021 年用同样的问题找到了这个。似乎不再需要 $in 运算符。只要你给 find() 传递一个元素数组,它就会搜索所有元素。

例如:

Furniture.find({
  room: [ 'first_id', 'second_id' ]
})

这将返回房间是第一个或第二个 id 的文档。

可以写成一个查询字符串,如:

?room=first_id&room=second_id

无需解析——Node 会自动将其解析为数组。

答案 3 :(得分:0)

mongodb文本搜索{“title”:“some thing”}将返回任何包含“some”或“thing”字样的文档。我不会完全匹配“某事”这句话。

因此,如果你想找到包含任何一系列单词的所有标题,你只需要{“title”:“word one two two four something dog cat last words”}它将返回任何包含任何文字的文档其中的那些词。

如果您想进行精确的词组匹配,则必须更改原始查询。