trong đó trường "truy vấn" là tham số truy vấn trong url được yêu cầu. Tôi muốn tính tổng số lượng được nhóm theo tham số truy vấn "tên". Ví dụ, đối với bộ sưu tập này
[{
url : "//example.com",
query : "name=blah,;another_param=bleh",
count : 3
},
{
url : "//example.com",
query : "name=blah,;another_param=xyz",
count : 4
},
{
url : "//example.com",
query : "name=another_name,;another_param=bleh",
count : 3
}]
Tôi cần đầu ra này
[{
key : "blah",
count : 7
},
{
key : "another_name",
count : 3
}]
Có vẻ như tôi không thể thực hiện thao tác chuỗi này bằng khung tổng hợp. Tôi có thể thực hiện việc này thông qua thu nhỏ bản đồ, nhưng thao tác thu nhỏ bản đồ có thể là một phần của quy trình tổng hợp không?
- stackoverflow. comghi bàn. 2
câu trả lời được chấp nhận
Khung tổng hợp không có các toán tử thao tác chuỗi cần thiết để phân tích nội dung chuỗi và chia nội dung này thành các cặp khóa/giá trị bạn cần cho thao tác này. Thao tác chuỗi duy nhất hiện có là
[{
key : "blah",
count : 7
},
{
key : "another_name",
count : 3
}]
1, điều này sẽ không hữu ích trừ khi bạn đang xử lý dữ liệu có độ dài cố địnhVì vậy, cách duy nhất phía máy chủ để thực hiện việc này hiện tại là với mapReduce vì bạn chỉ có thể sử dụng các hàm JavaScript có sẵn để thực hiện đúng thao tác. Một cái gì đó như thế này
Đối với người lập bản đồ
function[] {
var obj = {};
this.query.split[/,;/].forEach[function[item] {
var temp = item.split[/=/];
obj[temp[0]] = temp[1];
}];
if [obj.hasOwnProperty['name']
emit[obj.name,this.count];
}
Và bộ giảm tốc
function[key,values] {
return Array.sum[ values ];
}
Cấu trúc cơ bản của các hàm JavaScript cần thiết để tách các tham số "tên" và sử dụng chúng làm "khóa" để tổng hợp hoặc đếm chung các lần xuất hiện "khóa"
Vì vậy, khung tổng hợp không thể tự thực thi bất kỳ JavaScript nào, vì nó chỉ chạy các toán tử mã gốc trên dữ liệu
Mặc dù vậy, sẽ là một ý kiến hay khi xem xét việc thay đổi cách lưu trữ dữ liệu của bạn, để các phần tử được chia nhỏ thành một biểu diễn "đối tượng" thay vì một chuỗi khi tài liệu được chèn vào MongoDB. Điều này cho phép các biểu mẫu truy vấn gốc không dựa vào thực thi JavaScript để thao tác dữ liệu
[{
"url": "//example.com",
"query": {
"name": "blah",
"another_param": "bleh"
},
"count": 3
},
{
"url": "//example.com",
"query": {
"name": "blah",
"another_param": "xyz"
},
"count": 4
},
{
"url": "//example.com",
"query": {
"name": "another_name",
"another_param": "bleh"
},
"count": 3
}]
Điều này làm cho giai đoạn quy trình
[{
key : "blah",
count : 7
},
{
key : "another_name",
count : 3
}]
2 trở nên khá đơn giản vì dữ liệu hiện được tổ chức ở dạng có thể được xử lý nguyên bản{ "$match": { "query.name": { "$exists": true } },
{ "$group": {
"_id": "$query.name",
"count": { "$sum": "$count" }
}}
Vì vậy, hãy sử dụng mapReduce ngay bây giờ, nhưng cuối cùng hãy cân nhắc việc thay đổi bản ghi dữ liệu của bạn để tách "mã thông báo" khỏi chuỗi truy vấn và biểu thị điều này dưới dạng dữ liệu có cấu trúc, tùy chọn giữ chuỗi gốc trong một trường khác
Khung tổng hợp sẽ xử lý việc này nhanh hơn nhiều so với mapReduce có thể, vì vậy đây sẽ là tùy chọn liên tục tốt hơn
Lưu ý rằng mọi tài liệu có chuỗi "Tây" trong trường hội nghị hiện có "Tây" trong trường hội nghịBất kỳ tài liệu nào không có chuỗi “Tây” trong trường hội nghị chỉ cần giữ chuỗi gốc của chúng
Ví dụ cụ thể này trích xuất bốn ký tự từ trường có tiêu đề “fullString” bắt đầu từ vị trí 0Ví dụ sau đây cho thấy cách sử dụng cú pháp này trong thực tế với bộ sưu tập doanh số với các tài liệu sau.
db.sales.insertOne[{yearMonth: 201702, amount: 40}] db.sales.insertOne[{yearMonth: 201802, amount: 32}] db.sales.insertOne[{yearMonth: 201806, amount: 19}] db.sales.insertOne[{yearMonth: 201910, amount: 29}] db.sales.insertOne[{yearMonth: 201907, amount: 35}]
Ví dụ. Cách sử dụng Hàm $substr trong MongoDB
Chúng ta có thể sử dụng đoạn mã sau để trích xuất bốn ký tự đầu tiên từ trường “yearMonth” và hiển thị nó trong một trường mới có tiêu đề “năm”
db.sales.aggregate[[ { $project: {year: { $substr: [ "$yearMonth", 0, 4 ] }}} ]]
Mã này tạo ra đầu ra sau
________số 8Lưu ý rằng bốn ký tự đầu tiên từ trường “thángNăm” trong mỗi tài liệu được hiển thị trong một trường mới có tiêu đề “năm. ”
Điều quan trọng cần lưu ý là mã này chỉ hiển thị chuỗi con
Để thực sự thêm một trường mới vào tập hợp chứa chuỗi con này, chúng ta phải sử dụng hàm $merge như sau
db.sales.aggregate[[ { $project: {year: { $substr: [ "$yearMonth", 0, 4 ] }}}, { $merge: "sales" } ]]
Đây là bộ sưu tập được cập nhật trông như thế nào
[{
key : "blah",
count : 7
},
{
key : "another_name",
count : 3
}]
0Lưu ý rằng trường mới có tiêu đề “năm” đã được thêm vào mỗi tài liệu trong bộ sưu tập và nó hiển thị bốn ký tự đầu tiên từ trường “nămTháng”.