我有以下檔案
[
{
"_id": "624713340a3d2901f2f5a9c0",
"username": "fotis",
"exercises": [
{
"_id": "624713530a3d2901f2f5a9c3",
"description": "Sitting",
"duration": 60,
"date": "2022-03-24T00:00:00.000Z"
},
{
"_id": "6247136a0a3d2901f2f5a9c6",
"description": "Coding",
"duration": 999,
"date": "2022-03-31T00:00:00.000Z"
},
{
"_id": "624713a00a3d2901f2f5a9ca",
"description": "Sitting",
"duration": 999,
"date": "2022-03-30T00:00:00.000Z"
}
],
"__v": 3
}
]
我正在執行以下聚合(在mongoplayground.net上)
db.collection.aggregate([
{
$match: {
"_id": "624713340a3d2901f2f5a9c0"
}
},
{
$project: {
exercises: {
$filter: {
input: "$exercises",
as: "exercise",
cond: {
$eq: [
"$$exercise.description",
"Sitting"
]
}
}
},
limit: 1
}
}
])
結果如下
[
{
"_id": "624713340a3d2901f2f5a9c0",
"exercises": [
{
"_id": "624713530a3d2901f2f5a9c3",
"date": "2022-03-24T00:00:00.000Z",
"description": "Sitting",
"duration": 60
},
{
"_id": "624713a00a3d2901f2f5a9ca",
"date": "2022-03-30T00:00:00.000Z",
"description": "Sitting",
"duration": 999
}
]
}
]
所以我的第一個問題是為什么用戶名字段不包含在結果中?
第二個是為什么練習不限于1?限制當前是否適用于整個用戶檔案?如果是這樣,是否可以僅將其應用于練習子檔案?
謝謝!
uj5u.com熱心網友回復:
第一個問題
當您使用$project階段時,只會回傳您在階段中指定的屬性。您只指定了exercises屬性,因此只回傳一個。請注意,_id默認情況下會回傳該屬性,即使您沒有指定它。
第二個問題
$limit也是一個舞臺$project。您可以應用于$limit整個生成的檔案陣列,而不是一個檔案的嵌套陣列屬性。
解決方案
在$projectstage中,你也可以指定usernamefiled,所以它也會被回傳。代替$limit,您可以使用$slice來指定要從陣列屬性回傳的檔案數。
db.collection.aggregate([
{
"$match": {
"_id": "624713340a3d2901f2f5a9c0"
}
},
{
"$project": {
"username": 1,
"exercises": {
"$slice": [
{
"$filter": {
"input": "$exercises",
"as": "exercise",
"cond": {
"$eq": [
"$$exercise.description",
"Sitting"
]
}
}
},
1
]
}
}
}
])
作業示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455115.html
