【问题标题】:query through populated field in mongo [duplicate]通过mongo中的填充字段查询[重复]
【发布时间】:2018-10-01 16:50:00
【问题描述】:

我想通过填充字段进行查询。在这种情况下,填充的字段是评论。因此,如果我的搜索查询与评论表描述字段匹配......然后返回那本书。评论是一个对象数组,描述是其中的一个键。

我尝试在查询对象中使用reviews[0].description,但没有成功。

getBookInfo: (req, res) => {
        const search = req.params.search;
        const query = { $or: [{ title: { $regex: search, $options: 'i' } }] };
        Books.find(query).populate('reviews').exec(function(err, books) {
            if (err) {
                return err;
            }
            return books;
        });
    }

【问题讨论】:

  • 所以您搜索的是评论而不是书籍。我说的对吗?
  • @num8er 是的,我想同时搜索。所以书籍字段将是标题,然后还从评论中搜索描述
  • 所以你有一个以titledescription 为属性的图书模式,对吗?
  • @GeorgeBailey 是的,这是正确的。在书籍架构中......我有标题、描述和评论(它是对评论表的引用)。在评论表中,我也有标题和描述
  • 是的,这是最常用和欣赏的。我完全同意

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

您想要搜索与您的查询匹配的书籍并填充评论。

所以 documentation 你有权使用 match 来表示人口。

给你:

getBookInfo: async (req, res) => {
  try {
    const search = req.params.search;

    // query for books matching by condition
    const query = { 
      $or: [
        { title: { $regex: search, $options: 'i' } },
        { description: { $regex: search, $options: 'i' } },
      ] 
    };

    // include reviews matching by conditions
    const include = {
      path: 'reviews',
      match: {
        description: { 
          $regex: search, 
          $options: 'i' 
        }
      },
      options: {limit: 5}
    };

    const books = await Books
                          .find(query)
                          .populate(include)
                          .lean();
    res.status(200).send(books);
  }
  catch (error) {
    res.status(500).send(error);
  }
};

更新:

据我了解,您想同时查询评论和书籍。

  1. 在 Review 模型中有 book 字段,它将保留书籍 _idtitledescription
  2. 当用户添加评论时,只需将该图书数据放入评论文档中即可。
  3. 直接查询评论集合。

【讨论】:

  • 没用 :(
  • @HeelMega 我在您的问题下添加了一些评论。你必须建立一些索引集合。 Mongodb 不允许这样复杂的查询。
  • 是的,我认为这是要走的路
  • @HeelMega 或者如果您在路径的开头,请切换到 MySQL、Postgres 并作为 ORM 使用 Sequelize
  • 现在...我得到了一个大数组中所有评论的_id。我如何将它们放在我的查询中,因为它是一个数组而不仅仅是一个字符串
猜你喜欢
  • 1970-01-01
  • 2018-07-31
  • 2017-06-15
  • 2013-11-03
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2016-11-18
相关资源
最近更新 更多