javascript - 找到父文档后如何查询mongoDB子文档

标签 javascript mongodb mongoose

我正在尝试使用 mongoose 查询 mongoDB 数据库中特定文档的子文档。我想首先运行查询来获取特定的用户文档,然后查询子文档数组以查找与特定 id 匹配的文档。

这里提供一些上下文是我的数据结构

enter image description here

每个文档都针对特定用户,articleVotes 子文档包含他们投票的文章。使用我的 Usermongoose 模型通过 User.findOne({_id: req.user._id)) 查找当前用户文档后,我想检查他们是否有通过执行类似于 findOne({_id:articleId, voteType: "1"}) 的操作,对特定文章进行了投票。然而,因为它是一个子文档,我正在努力弄清楚如何做到这一点。有人可以解释一下我该怎么做吗?

最佳答案

您可以使用$filter运算符,

MongoDB v4.4 支持findOne()

  • $filter在投影中迭代 atricleVotes 的循环使用条件 articleId 进行数组和过滤和voteType
db.collection.findOne({
  _id: req.user._id,
  "atricleVotes.articleId": articleId
},
{
  _id: 1,
  atricleVotes: {
    $filter: {
      input: "$atricleVotes",
      cond: {
        $and: [
          { $eq: ["$$this.articleId", articleId] },
          { $eq: ["$$this.voteType", 1] }
        ]
      }
    }
  }
})

Playground


MongoDB v3.2 或更高版本

  • $match你的条件
  • $addFields获得相同的 $filter 操作并进行过滤 atricleVotes
db.collection.aggregate([
  {
    $match: {
      _id: req.user._id,
      "atricleVotes.articleId": articleId
    }
  },
  {
    $addFields: {
      atricleVotes: {
        $filter: {
          input: "$atricleVotes",
          cond: {
            $and: [
              { $eq: ["$$this.articleId", articleId] },
              { $eq: ["$$this.voteType", 1] }
            ]
          }
        }
      }
    }
  }
])

Playground

关于javascript - 找到父文档后如何查询mongoDB子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65467918/

相关文章:

node.js - 如何实现 mongodb find 查询的后备?

javascript - SQL 查询的 mongoose 等价物是什么

node.js - 如何在控制台中打印 mongoose find() 数组文档

node.js - MongoDB 和 Mongoose 的区别

javascript - jqplot 到图像在 IE7 上不起作用

javascript - Mapbox GL JS : Clustering circle not rendered properly upon zooming out

javascript - 如何防止在 chrome 和 safari 中从 "empty"位置双击选择

javascript - Javascript 中的 Flask 变量不显示

mongodb - 如何将字符串转换为BSON

c# - Swagger(C# 的 Swashbuckle)将 Mongo ObjectId 显示为多个字段而不是单个字符串