首页 > 解决方案 > 如何从文档中的对象数组中仅获取一个与搜索条件匹配的对象?

问题描述

我有一组具有如下数据结构的主题:

{
  topicId:"LSCv0mnb" ,
  posts:[
   {
    postId: "nNP8UDxL",
    createdBy: "Sam"
   }, 
   {
    postId: "aJ8UxLa",
    createdBy: "Bob"
   }
 ]
}

{
  topicId:"hlsTOgAX" ,
  posts:[
   {
    postId: "E3cJa0Nm",
    createdBy: "Samanta"
   }, 
   {
    postId: "Rt0xQnAy",
    createdBy: "Jessica"
   }
 ]
}

就我而言,我只需要从帖子数组中获取特定帖子。所以我目前正在做的是我findOne用来查找特定主题:

const topic = await this.db.collection('topics').findOne({ topicId: { $eq: topicId })

而不是我只是循环通过topic.posts以下方式获取帖子postId

const post = topic.posts.find(post => post.postId === postId)

我有 2 个问题。

我可以查询 MongoDB 以仅从帖子数组中获取帖子而没有其他内容吗?例如,我有 atopicId和 a postId,我的预期返回值为:

{
  postId: "E3cJa0Nm",
  createdBy: "Samanta"
}

如果可以使用 MongoDB,那么从性能角度来看,在我的网络服务器上进行是否更好?

谢谢你。

标签: mongodbmongodb-queryaggregation-framework

解决方案


您可以使用聚合

  • $unwind解构数组
  • $match匹配元素
  • $replaceRoot让它生根

这是代码

db.collection.aggregate([
  {
    "$unwind": "$posts"
  },
  {
    "$match": {
      "posts.postId": "E3cJa0Nm",
      "posts.createdBy": "Samanta"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$posts"
    }
  }
])

工作Mongo游乐场


推荐阅读