【问题标题】:Nested populate filteration is MongoDB嵌套填充过滤是 MongoDB
【发布时间】:2021-07-24 15:44:32
【问题描述】:

我有以下代码可以正常工作;

return await Order.find({}).populate({
  path: 'items.product',
  select: "title price user",
  populate: {
    path: 'user',
    select: "_id name"
  }
})

是否可以在嵌套填充中添加与用户名匹配的查询并仅显示匹配的结果,例如:

return await Order.find({}).populate({
  path: 'items.product',
  select: "title price user",
  populate: {
    path: 'user',
    select: "_id name",
    match:{name: "name of the user"}
  }
})

因为即使嵌套填充的用户名不匹配,此代码也始终显示所有订单。

我想要的是,如果用户名不匹配,那么它根本不应该显示任何订单结果。我不知道我是否设法解释了。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework nodes


    【解决方案1】:

    在执行await Order.find({}).populate({时,Mongoose首先将find发送到mongod服务器,并返回一个游标,传给populate。

    Populate 然后从游标中检索每个文档,并将单独的find 发送到user 集合以检索匹配的文档,并迭代该游标,将检索到的文档放置在原始文档中的数组中.

    Populate 可以影响原始文档中嵌入了哪些文档,但它无法从原始结果集中删除文档。

    传递给填充的match 意味着只有匹配的用户被添加到原始文档中,因此您应该能够使用filter 来消除结果中不包含用户的任何文档。

    【讨论】:

    • 谢谢。那么这里的解决方案是什么?
    • 使用filter
    • 你的意思是array.filter得到结果后?还是 mongoDb 过滤器?
    • Mongoose 在调用 populate 之前已经收到了来自 MongoDB 的结果,因此对数据库大小进行任何过滤都为时已晚,您需要使用 array.filter。
    猜你喜欢
    • 2021-06-06
    • 2021-11-07
    • 1970-01-01
    • 2021-05-23
    • 2021-02-17
    • 1970-01-01
    • 2018-01-26
    • 2015-12-06
    • 2021-12-13
    相关资源
    最近更新 更多