【问题标题】:mongoose query same field with different values猫鼬查询具有不同值的相同字段
【发布时间】:2017-08-26 01:57:39
【问题描述】:

有没有办法让用户mongoose.find({title:'some title'}) 查询具有多个值的同一字段?例如像 mongoose.find({title:'some title', title:'some other title'}) 这样的东西只发回匹配 title:'some other title 的文档有没有办法做到这一点?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

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

    因此,如果您想查找包含任何一系列单词的所有标题,您只需执行 {"title":"word one 二三四 something dog cat last word"} 它将返回任何包含任何单词的文档里面的那些话。

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

    【讨论】:

    • mongodb 查询 {"title":"some thing"} 将返回任何包含单词“some”或单词“thing”的文档。你确定吗?
    • 文本搜索采用“MongoDB 解析并用于查询文本索引的术语字符串。MongoDB 对术语执行逻辑 OR 搜索,除非指定为短语。有关该字段的更多信息,请参阅行为。” docs.mongodb.com/manual/reference/operator/query/text。除非猫鼬修改了这种行为,否则我希望它是一样的。
    • 我同意,但您在回答中没有提到 文本搜索。 OP 正在谈论查找搜索,而您的回答似乎具有误导性。
    • 更新了我的答案以避免任何混淆。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这是一个正确的解决方案,不知道他为什么不接受这个。
    【解决方案3】:

    如果您是根据 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 查询的方法。

    【讨论】:

      【解决方案4】:

      在 2021 年以同样的问题发现此问题。似乎不再需要 $in 运算符。只要你给 find() 传入一个数组,它就会搜索所有的元素。

      例如:

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

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

      可以写成如下查询字符串:

      ?room=first_id&room=second_id
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2020-03-07
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多