Những gì bạn cần là mã $ redact >
toán tử trong khung tổng hợp cho phép bạn xử lý điều kiện logic ở trên với $ cond
và sử dụng các phép toán đặc biệt $$ GIỮ
để "giữ" tài liệu có điều kiện logic đúng hoặc $$ PRUNE
để "xóa" tài liệu có điều kiện sai.
Thao tác này tương tự như có $ dự án
đường ống chọn các trường trong bộ sưu tập và tạo một trường mới chứa kết quả từ truy vấn điều kiện logic và sau đó là $match
, ngoại trừ $ redact
sử dụng một giai đoạn đường ống duy nhất hiệu quả hơn.
Hãy xem xét ví dụ sau đây minh chứng cho khái niệm trên:
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$gte": [
{ "$divide": ["$Number1", "$Number2"] },
CONSTANT_VAR
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
Vì không có không hỗ trợ $ redact
nhà điều hành chưa
(tại thời điểm viết bài), giải pháp thay thế sẽ là triển khai AggregationOperation
giao diện bao bọc hoạt động tổng hợp với một lớp để đưa vào một DBObject
:
public class RedactAggregationOperation implements AggregationOperation {
private DBObject operation;
public RedactAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
sau đó bạn có thể sử dụng trong TypeAggregation
:
Aggregation agg = newAggregation(
new RedactAggregationOperation(
new BasicDBObject(
"$redact",
new BasicDBObject(
"$cond", new BasicDBObject()
.append("if", new BasicDBObject(
"$gte", Arrays.asList(
new BasicDBObject(
"$divide", Arrays.asList( "$Number1", "$Number2" )
),
CONSTANT_VAR
)
)
)
.append("then", "$$KEEP")
.append("else", "$$PRUNE")
)
)
)
);
AggregationResults<Example> results = mongoTemplate.aggregate(
(TypedAggregation<Example>) agg, Example.class);
- NGÀY CÚP--
Theo dõi các nhận xét, để kiểm tra các giá trị rỗng hoặc 0 trên Number2
trong phân chia, bạn sẽ phải lồng một mã <> $ cond
biểu thức với logic thay thế.
Ví dụ sau giả sử bạn có giá trị giữ chỗ là 1 nếu Number2
không tồn tại / rỗng hoặc có giá trị bằng 0:
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$gte": [
{
"$divide": [
"$Number1", {
"$cond": [
{
"$or": [
{ "$eq": ["$Number2", 0] },
{
"$eq": [
{ "$ifNull": ["$Number2", 0] }, 0
]
}
]
},
1, // placeholder value if Number2 is 0
"$Number2"
]
}
]
},
CONSTANT_VAR
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
Tổng hợp dữ liệu mùa xuân tương đương (chưa được kiểm tra)
Aggregation agg = newAggregation(
new RedactAggregationOperation(
new BasicDBObject(
"$redact",
new BasicDBObject(
"$cond", Arrays.asList(
new BasicDBObject(
"$gte", Arrays.asList(
new BasicDBObject(
"$divide", Arrays.asList(
"$Number1",
new BasicDBObject(
"$cond", Arrays.asList(
new BasicDBObject( "$or": Arrays.asList(
new BasicDBObject("$eq", Arrays.asList("$Number2", 0)),
new BasicDBObject("$eq", Arrays.asList(
new BasicDBObject("$ifNull", Arrays.asList("$Number2", 0)), 0
)
)
)
),
1, // placeholder value if Number2 is 0
"$Number2"
)
)
)
),
CONSTANT_VAR
)
), "$$KEEP", "$$PRUNE"
)
)
)
)
);