微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MongoDB 在子文档中查找

如何解决MongoDB 在子文档中查找

我有一堆文档,每个文档的格式都是这样的:

{
  "faculty": "Some Faculty","students": [
      {
        "id": "51230867123","age": "21","name": "awdawdawdawawd"
      },{
        "id": "0217356102","age": "22","name": "awdawd"
      },...
      ]
}

我已使用 insertMany([...]) 将这些文档插入到单个 MongoDB 集合中,所以现在我的 students 表如下所示:

{
  "faculty": "Some Faculty","name": "John Doe"
      },"name": "Jane Doe"
      },...
      ]
},{
  "faculty": "Other Faculty","students": [
      {
        "id": "1240876124","name": "Jimmy Doe"
      },{
        "id": "2309857120578","name": "Johnny Doe"
      },...

我非常想了解如何对某些子文档(特别是 find)执行 students 查询。例如,我想用 find students.name 所有 students.age > 23。我尝试了很多查询包括 db.students.find({"students.age": {$gt: /.*B.*/}},{_id: 0,"students.name": 1}),但这些查询总是返回至少一个学生满足条件的整个文档。我想查询个别学生。这可以使用 find(没有 aggregate)吗?

通过aggregate,可以使用unwrap,这几乎正是我需要做的。但是,我希望使用 find 的一些技巧来实现这种行为。

解决方法

您可以在 find 和 findOne 方法的投影中使用聚合运算符,从 MongoDB 4.2 开始,

  • $filter 迭代学生数组的循环并检查所需条件,它将返回过滤结果
  • $map 迭代上述过滤结果的循环并仅返回 name
db.collection.find(
  { "students.age": { $gt: "23" } },{
    "students": {
      $map: {
        input: {
          $filter: {
            input: "$students",cond: { $gt: ["$$this.age","23"] }
          }
        },in: "$$this.name"
      }
    }
  }
)

Playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。