我是 MongoDB 的新手,我無法僅檢索嵌入檔案陣列的子集。例如,我有以下檔案:
{
"_id": "Stock1",
"data": [{"value": 10.0, "date": "2000-01-01T00:00:00.000Z"},
{"value": 12.0, "date": "2010-01-01T00:00:00.000Z"},
{"value": 14.0, "date": "2020-01-01T00:00:00.000Z"}]
},
{
"_id": "Stock2",
"data": [{"value": 10.0, "date": "2000-01-01T00:00:00.000Z"},
{"value": 8.0, "date": "2010-01-01T00:00:00.000Z"},
{"value": 6.0, "date": "2020-01-01T00:00:00.000Z"}]
},
{
"_id": "Stock3",
"data": [{"value": 10.0, "date": "2000-01-01T00:00:00.000Z"},
{"value": 10.0, "date": "2010-01-01T00:00:00.000Z"},
{"value": 10.0, "date": "2020-01-01T00:00:00.000Z"}]
}
我想data在date2010-01-01 和 2020-01-01(包括)之間檢索“Stock1”和“Stock3”,即我想以這個結束:
{
"_id": "Stock1",
"data": [{"value": 12.0, "date": "2010-01-01T00:00:00.000Z"},
{"value": 14.0, "date": "2020-01-01T00:00:00.000Z"}]
},
{
"_id": "Stock3",
"data": [{"value": 10.0, "date": "2010-01-01T00:00:00.000Z"},
{"value": 10.0, "date": "2020-01-01T00:00:00.000Z"}]
}
我試過find命令:
{"_id": {$in: ["Stock1", "Stock3"]}, "data.date": {$gte: ISODate('2010-01-01'), $lte: ISODate('2020-01-01')}}
但我正在檢索所有日期,這是不可取的。
我知道該aggregate命令,但我不確定如何構建管道。有人可以指出我應該如何進行嗎?
任何幫助將不勝感激!
uj5u.com熱心網友回復:
方案一
$unwind- 將data陣列解構為檔案。$match- 根據id和日期范圍過濾data.date。$group- 分組依據id(步驟 1 的相反)。
db.collection.aggregate([
{
$unwind: "$data"
},
{
$match: {
$expr: {
$and: [
{
$in: [
"$_id",
[
"Stock1",
"Stock3"
]
]
},
{
$gte: [
{
$toDate: "$data.date"
},
ISODate("2010-01-01")
]
},
{
$lte: [
{
$toDate: "$data.date"
},
ISODate("2020-01-01")
]
}
]
}
}
},
{
$group: {
"_id": "$_id",
"data": {
$push: "$data"
}
}
}
])
Mongo Playground 示例解決方案 1
解決方案2
$match- 基于_id.$project- 顯示帶有$filter資料陣列的檔案。
db.collection.aggregate([
{
$match: {
"_id": {
$in: [
"Stock1",
"Stock3"
]
}
}
},
{
$project: {
"_id": 1,
"data": {
"$filter": {
"input": "$data",
"cond": {
"$and": [
{
$gte: [
{
$toDate: "$$this.date"
},
ISODate("2010-01-01")
]
},
{
$lte: [
{
$toDate: "$$this.date"
},
ISODate("2020-01-01")
]
}
]
}
}
}
}
}
])
Mongo Playground 示例解決方案 2
uj5u.com熱心網友回復:
您可以使用$elemMatch:
{"_id": {$in: ["Stock1", "Stock3"]}, "data":{$elemMatch:{date: {$gte: ISODate('2010-01-01'), $lte: ISODate('2020-01-01')}}}}
單個嵌套檔案在嵌套欄位上滿足多個查詢條件
使用 $elemMatch 運算子在一組嵌入檔案上指定多個條件,以便至少一個嵌入檔案滿足所有指定的條件。
來源:https : //docs.mongodb.com/manual/tutorial/query-array-of-documents/
uj5u.com熱心網友回復:
為了避免$unwind并且$group您可以$filter在這樣的聚合查詢中使用:
db.collection.aggregate([
{
"$match": {
"_id": {
"$in": ["Stock1","Stock3"]
}
}
},
{
"$project": {
"data": {
"$filter": {
"input": "$data",
"as": "d",
"cond": {
"$and": [
{
"$gte": [{"$toDate": "$$d.date"},ISODate("2010-01-01")]
},
{
"$lte": [{"$toDate": "$$d.date"},ISODate("2020-01-01")]
}
]
}
}
}
}
}
])
示例在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360474.html
標籤:数组 MongoDB mongodb-查询 nosql 文档
