Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB在子文档中查找_Mongodb_Subdocument - Fatal编程技术网

MongoDB在子文档中查找

MongoDB在子文档中查找,mongodb,subdocument,Mongodb,Subdocument,我有一堆文档,其中每个文档的格式如下: { "faculty": "Some Faculty", "students": [ { "id": "51230867123", "age": "21", "name": "awdawdawdawawd"

我有一堆文档,其中每个文档的格式如下:

{
  "faculty": "Some Faculty",
  "students": [
      {
        "id": "51230867123",
        "age": "21",
        "name": "awdawdawdawawd"
      },
      {
        "id": "0217356102",
        "age": "22",
        "name": "awdawd"
      },
      ...
      ]
}
我已经使用
insertMany([…])
将这些文档插入到单个MongoDB集合中,因此现在我的
students
表如下所示:

{
  "faculty": "Some Faculty",
  "students": [
      {
        "id": "51230867123",
        "age": "21",
        "name": "John Doe"
      },
      {
        "id": "0217356102",
        "age": "22",
        "name": "Jane Doe"
      },
      ...
      ]
},
{
  "faculty": "Other Faculty",
  "students": [
      {
        "id": "1240876124",
        "age": "21",
        "name": "Jimmy Doe"
      },
      {
        "id": "2309857120578",
        "age": "22",
        "name": "Johnny Doe"
      },
      ...
      ]
},
...
我非常想了解如何对某些子文档执行
find
查询,特别是
students
。例如,我想用
students.age>23查找所有
students.name
。我尝试了许多查询,包括
db.students.find({“students.age”:{$gt:/.*B.*/}},{u id:0,“students.name”:1})
,但这些查询总是返回至少一个学生满足条件的完整文档。我想询问个别学生。使用
find
(无
aggregate
)是否可以这样做


使用
aggregate
,可以使用
unwrap
,这正是我需要做的。然而,我希望通过使用
find
来实现这种行为。

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

  • $filter
    要迭代students数组的循环并检查所需条件,它将返回筛选结果
  • $map
    迭代上述过滤结果的循环,并仅返回
    name

尽管您两次指定了条件,但还是有点奇怪。这种方法需要这样做吗?是的,它需要,查询部分过滤主根文档,投影过滤器匹配学生数组中的对象。
db.collection.find(
  { "students.age": { $gt: "23" } },
  {
    "students": {
      $map: {
        input: {
          $filter: {
            input: "$students",
            cond: { $gt: ["$$this.age", "23"] }
          }
        },
        in: "$$this.name"
      }
    }
  }
)