【问题标题】:Mongodb use $elemMatch into $filterMongodb 使用 $elemMatch 到 $filter
【发布时间】:2021-06-23 21:37:01
【问题描述】:

我有这样的文件:

我需要返回文档并过滤嵌套数组(课程),其中任何子课程项目进入输入数组

[{
  "_id": {
    "$oid": "6081fedbee5d133dbffb42eb"
  },
  "name": "my quiz",
  "lessons": [
    {
      "_id": "460c42e1-b0b7-437e-ab63-c59cce8ced0d",
      "name": "section",
      "subLesson": [
        {
          "$oid": "6081fed9ee5d133dbffb3cba"
        },
        {
          "$oid": "6081fed9ee5d133dbffb3cc0"
        }
      ]
    },
    {
      "_id": "f7b5c95f-1a68-42ca-880c-22ef3831ff03",
      "name": "ffff",
      "subLesson": [
        {
          "$oid": "6081fed9ee5d133dbffb3cbb"
        }
      ]
    }
  ]
}
}]

我编写了以下查询,但它不起作用。我不知道如何在 $filter 中使用 $elemMatch

db.collection.aggregate([
  {
    "$project": {
      _id: 1,
      lessons: {
        $filter: {
          "input": "$lessons",
          "as": "lesson",
          "cond": {
            "$$lesson.subLesson": {
              "$elemMatch": {
                "$in": [
                  ObjectId("6081fed9ee5d133dbffb3cba")
                ]
              }
            }
          }
        }
      }
    }
  }
])

我正在尝试查找结果如下所示的记录。

[{
  "_id": {
    "$oid": "6081fedbee5d133dbffb42eb"
  },
  "lessons": [
    {
      "_id": "460c42e1-b0b7-437e-ab63-c59cce8ced0d",
      "name": "zzzz",
      "subLesson": [
        {
          "$oid": "6081fed9ee5d133dbffb3cba"
        },
        {
          "$oid": "6081fed9ee5d133dbffb3cc0"
        }
      ]
    }
  ]
},
}]

任何人都可以帮助了解我该如何进行这项工作 谢谢

【问题讨论】:

    标签: arrays mongodb filter mongodb-query project


    【解决方案1】:

    你可以直接使用$in

    db.collection.aggregate([
      {
        $project: {
          lessons: {
            $filter: {
              input: "$lessons",
              cond: {
                $in: [ ObjectId("6081fed9ee5d133dbffb3cba"), "$$this.subLesson" ]
              }
            }
          }
        }
      }
    ])
    

    工作Mongo playground

    更新 1

    db.collection.aggregate([
      { "$unwind": "$lessons" },
      {
        "$match": {
          "lessons.subLesson": {
            $in: [ ObjectId("6081fed9ee5d133dbffb3cba"),  ObjectId("6081fed9ee5d133dbffb3cbb") ]
          }
        }
      },
      {
        $group: {
          _id: "$_id",
          name: { $first: "$name" },
          lessons: { $push: "$lessons" }
        }
      }
    ])
    

    蒙古Playground

    【讨论】:

    • 很抱歉您误会了我。查询输入是一个数组。例如: cond: { $in: [[ObjectId("6081fed9ee5d133dbffb3cba"),ObjectId("6081fed9ee5d133dbffb3cbf")], "$$this.subLesson" ] } subLesson 输入objectId数组中的任何项目
    • @davoodrokhbakhsh 我已经更新了答案,如果有什么问题请告诉我
    • @davoodrokhbakhsh 这个答案对你有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多