Bản đồ giảm cho phép bạn xử lý các khóa được đặt tên nhưng tổng hợp là cách để thực hiện các truy vấn hiệu quả.
Bạn phải lập mô hình dữ liệu dưới dạng mảng tài liệu nhúng cho khung tổng hợp.
Tôi đã cung cấp cho bạn hai lựa chọn. Bạn có thể kiểm tra chúng cho tập dữ liệu của mình và xem cái nào phù hợp hơn với bạn.
Một cái gì đó giống như
"v":[
{
"minute":1,
"seconds":[
{
"second":54,
"data":{
"field1":7.373158,
"entry_id":4635,
"field3":0.19,
"field2":88
}
}
]
},
{
"minute":2,
"seconds":...
}
]
Giờ đây, bạn có thể dễ dàng truy vấn các mục có chỉ số cảm biến:"field1"> 2.
db.col.aggregate(
[{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$unwind":"$v"},
{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$unwind":"$v.seconds"},
{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$project":{"data":"$v.seconds.data"}}]
)
Ngoài ra, bạn có thể chia nhỏ các tài liệu theo phút. Một cái gì đó giống như
"v":[
{
"second":1,
"data":{
"field1":7.373158,
"entry_id":4635,
"field3":0.19,
"field2":88
}
},
{
"second":2,
"data":...
}
]
Bây giờ bạn có thể truy vấn như (với chỉ mục trên v.data.field1)
db.col.aggregate(
[{"$match":{"v.data.field1":{"$gt":2}}},
{"$unwind":"$v"},
{"$match":{"v.data.field1":{"$gt":2}}},
{"$project":{"data":"$v.data"}}]
)
Bạn có thể truy vấn các mục có chỉ số cảm biến:"field1"> 2 và "field3"> 5
Sử dụng cấu trúc đầu tiên
db.col.aggregate(
[{"$match":{"v":{"$elemMatch":{"seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}}}},
{"$unwind":"$v"},
{"$match":{"v.seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
{"$unwind":"$v.seconds"},
{"$project":{"data":"$v.seconds.data"}}]
)
Sử dụng cấu trúc thứ hai
db.col.aggregate(
[{"$match":{"v.data":{$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
{"$unwind":"$v"},
{"$match":{"v.data.field1":{"$gt":2},"v.data.field3":{"$gt":5} }},
{"$project":{"data":"$v.data"}}]
)
Bản cập nhật Mongo 3.6
$match
với $expr
chấp nhận biểu thức tổng hợp.
$gt > 0
- biểu thức tổng hợp để kiểm tra xem tổng của tất cả các tiêu chí giây phù hợp trong một phút lớn hơn 0
$objectToArray
để chuyển đổi các khóa được đặt tên thành cặp giá trị khóa, theo sau là $filter
giây trên tiêu chí đầu vào và đầu ra không có bản ghi giây phù hợp.
db.testcol.aggregate(
{"$match":{
"$expr":{
"$gt":[
{"$sum":{
"$map":{
"input":{"$objectToArray":"$v"},
"as":"secondsofminute",
"in":{
"$size":{
"$filter":{
"input":{"$objectToArray":"$$secondsofminute.v"},
"as":"seconds",
"cond":{"$gt":["$$seconds.v.field2",2]}
}
}
}
}
}},
0]
}
}})
Bản cập nhật Mongo 3.4 - Thay thế $expr
với $redact
db.col.aggregate(
{"$redact":{
"$cond":{
"if":{
"$gt":[
{"$sum":{
"$map":{
"input":{"$objectToArray":"$v"},
"as":"secondsofminute",
"in":{
"$size":{
"$filter":{
"input":{"$objectToArray":"$$secondsofminute.v"},
"as":"seconds",
"cond":{"$gt":["$$seconds.v.field2",2]}
}
}
}
}
}},
0]
},
"then":"$$KEEP",
"else":"$$PRUNE"
}
}})