mongodb获取嵌套数组内的数组

发布于 2025-01-13 10:09:01 字数 1167 浏览 4 评论 0原文

我对 mongodb 还是个新手,我有这个基本的注册系统数据:

{ "_id" : ObjectId("62277d92a561e550d5ec73ca"), "sid" : 1, "sname" : "sad", "semail" : "dsa", "scourse" : "it", "enrolled" : [ { "subjid" : 3 } ] }
{ "_id" : ObjectId("6227875bdbcc41a56a863697"), "sid" : 2, "sname" : "daws", "semail" : "dws", "scourse" : "cs", "enrolled" : [ { "subjid" : 1, "grades" : [ { "prelim" : "A", "midterm" : "B", "prefinal" : "B", "final" : "A" } ] }, { "subjid" : 2, "grades" : [ { "prelim" : "D", "midterm" : "A", "prefinal" : "B", "final" : "F" } ] } ] }

我想显示注册了 subjid 1 的 sid 2 的成绩。

我尝试使用这个聚合线:

 db.students2.aggregate( [{"$match":{"sid":{"$eq":2},"enrolled.subjid":{"$eq":2}}}, {$group: {_id:'$enrolled.subjid[1]', prelim:{$first:'$enrolled.grades.prelim'},midterm:{$first:'$enrolled.grades.midterm'},prefinal:{$first:'$enrolled.grades.prefinal'},"final":{$first:'$enrolled.grades.final'} } } ])

但这就是结果:

{ "_id" : [ ], "prelim" : [ [ "A" ], [ "D" ] ], "midterm" : [ [ "B" ], [ "A" ] ], "prefinal" : [ [ "B" ], [ "B" ] ], "final" : [ [ "A" ], [ "F" ] ] }

我只想获取成绩subjid 1 的成绩,但也获得了 subjid 2 的成绩

I'm still new to mongodb, I have this basic enrollment system data:

{ "_id" : ObjectId("62277d92a561e550d5ec73ca"), "sid" : 1, "sname" : "sad", "semail" : "dsa", "scourse" : "it", "enrolled" : [ { "subjid" : 3 } ] }
{ "_id" : ObjectId("6227875bdbcc41a56a863697"), "sid" : 2, "sname" : "daws", "semail" : "dws", "scourse" : "cs", "enrolled" : [ { "subjid" : 1, "grades" : [ { "prelim" : "A", "midterm" : "B", "prefinal" : "B", "final" : "A" } ] }, { "subjid" : 2, "grades" : [ { "prelim" : "D", "midterm" : "A", "prefinal" : "B", "final" : "F" } ] } ] }

I want display the grades of sid 2 who has enrolled subjid 1.

I tried using this aggregation line:

 db.students2.aggregate( [{"$match":{"sid":{"$eq":2},"enrolled.subjid":{"$eq":2}}}, {$group: {_id:'$enrolled.subjid[1]', prelim:{$first:'$enrolled.grades.prelim'},midterm:{$first:'$enrolled.grades.midterm'},prefinal:{$first:'$enrolled.grades.prefinal'},"final":{$first:'$enrolled.grades.final'} } } ])

but this was the result:

{ "_id" : [ ], "prelim" : [ [ "A" ], [ "D" ] ], "midterm" : [ [ "B" ], [ "A" ] ], "prefinal" : [ [ "B" ], [ "B" ] ], "final" : [ [ "A" ], [ "F" ] ] }

I only wanted to get the grades of subjid 1 but it also got the grades of subjid 2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丿*梦醉红颜 2025-01-20 10:09:01

也许您需要这样的东西:

db.collection.aggregate([
{
 "$match": {
  "sid": 2,
  "enrolled.subjid": 1
 }
},
{
 "$addFields": {
  "enrolled": {
    "$filter": {
      "input": "$enrolled",
      "as": "en",
      "cond": {
        $eq: [
          "$en.subjid",
          1
        ]
      }
    }
   }
  }
 },
 {
  $unwind: "$enrolled"
 },
 {
  $unwind: "$enrolled.grades"
 },
 {$limit:1}
  ,
 {
  $project: {
  _id: "$enrolled.subjid",
  prelim: "$enrolled.grades.prelim",
  midterm: "$enrolled.grades.midterm",
  prefinal: "$enrolled.grades.prefinal",
  "final": "$enrolled.grades.final"
  }
 }
])

解释:

  1. 匹配必要的文档(sid = 2,subjid = 1)
  2. 仅根据subjid(subjid = 1)过滤注册的元素
  3. 将两个数组
  4. 限制展开到仅在存在情况下可用的第一个结果文档更多的是。
  5. 项目必要的字段

游乐场

Maybe you need something like this:

db.collection.aggregate([
{
 "$match": {
  "sid": 2,
  "enrolled.subjid": 1
 }
},
{
 "$addFields": {
  "enrolled": {
    "$filter": {
      "input": "$enrolled",
      "as": "en",
      "cond": {
        $eq: [
          "$en.subjid",
          1
        ]
      }
    }
   }
  }
 },
 {
  $unwind: "$enrolled"
 },
 {
  $unwind: "$enrolled.grades"
 },
 {$limit:1}
  ,
 {
  $project: {
  _id: "$enrolled.subjid",
  prelim: "$enrolled.grades.prelim",
  midterm: "$enrolled.grades.midterm",
  prefinal: "$enrolled.grades.prefinal",
  "final": "$enrolled.grades.final"
  }
 }
])

Explained:

  1. Match the necessary documents (sid=2,subjid=1)
  2. Filter only the enrolled elements based on subjid ( subjid=1 )
  3. unwind the two array
  4. limit to the first result document available only in case there is more.
  5. project the necesary fields

playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文