Node.js mongoose查询具有不同值的同一字段

Node.js mongoose查询具有不同值的同一字段,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,有没有一种方法可以让用户mongoose.find({title:'some title'})用多个值查询同一字段?例如像这样的mongoose.find({title:'some title',title:'some other title'})只发回与title:'some other title匹配的文档,有什么方法可以做到这一点吗?mongodb文本搜索{“title:“some thing”}将返回任何包含单词“some”或“thing”的文档。我不会做一个与短语“某物”完全匹配的词

有没有一种方法可以让用户
mongoose.find({title:'some title'})
用多个值查询同一字段?例如像这样的
mongoose.find({title:'some title',title:'some other title'})
只发回与
title:'some other title
匹配的文档,有什么方法可以做到这一点吗?

mongodb文本搜索{“title:“some thing”}将返回任何包含单词“some”或“thing”的文档。我不会做一个与短语“某物”完全匹配的词

因此,如果您想查找包含任何一系列单词的所有标题,只需执行{“标题”:“word一二三四个字,dog cat last word”},它将返回任何包含这些单词的文档


如果要进行精确的短语匹配,则必须更改原始查询

您应该使用MongoDB操作符-

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

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

如果您是基于URL查询构建此查询,例如:
http://url.com/posts?title=one
但是查询中有多个值,这里有一种方法:

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

然后将请求函数设置为与async一起运行:

例如,
异步函数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查询的方法,对同一个对象键进行多个查询。

在2021年发现了这个问题。似乎不再需要$in运算符。只要向find()传递一个项目数组,它就会搜索所有项目

例:

这将返回文件,其中room是第一个或第二个id

可以写入查询字符串,如:

?room=first_id&room=second_id

无需解析节点自动将其解析为数组。

mongodb查询{“title”:“some thing”}将返回任何包含单词“some”或单词“thing”的文档。您确定吗?文本搜索采用“MongoDB解析并用于查询文本索引的一组术语。MongoDB对术语执行逻辑或搜索,除非指定为短语。有关字段的详细信息,请参阅行为。”。除非猫鼬改变了这种行为,我希望它是一样的。我同意,但在你的回答中没有提到文本搜索。OP讨论了查找搜索,你的答案似乎有误导性。更新了我的答案以避免任何混淆。这是一个正确的解决方案,不知道他为什么不接受这个。
?room=first_id&room=second_id