[英]MongoDB find among subdocuments
我有一堆文檔,其中每個文檔都以這種方式格式化:
{
"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"
},
...
]
},
...
我非常想知道如何對某些子文檔(尤其是students
)執行find
查詢。 例如,我想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"
}
}
}
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.