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"
}
}
}
)