Thao tác chuỗi MongoDB

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 : "http://example.com",
 query : "name=blah,;another_param=bleh",
 count : 3
},
{
 url : "http://example.com",
 query : "name=blah,;another_param=xyz",
 count : 4
},
{
 url : "http://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. com

ghi 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ố định

Vì 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": "http://example.com",
 "query": {
     "name": "blah",
     "another_param": "bleh"
 },
 "count": 3
},
{
 "url": "http://example.com",
 "query": {
     "name": "blah",
     "another_param": "xyz"
 },
 "count": 4
},
{
 "url": "http://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í 0

Ví 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ố 8

Lư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
 }]
0

Lư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”.

Làm cách nào để tìm chuỗi con trong chuỗi trong MongoDB?

Bạn có thể sử dụng hàm $substr trong MongoDB để trích xuất một chuỗi con từ một chuỗi. 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í 0.

Làm cách nào để tách chuỗi trong tập hợp MongoDB?

Để tách một chuỗi thành một mảng ký tự, chúng ta cần áp dụng biểu thức $substrCP cho mảng gồm tất cả các ký tự trong chỉ mục chuỗi bằng cách sử dụng toán tử $map. To get the array of index value is all integers from 0 to the string's length minus one which can generate using the $range and the $strLenCP operators.

$or trong MongoDB là gì?

MongoDB cung cấp các loại toán tử truy vấn logic khác nhau và toán tử $or là một trong số đó. Toán tử này được sử dụng để thực hiện phép toán OR logic trên mảng gồm hai biểu thức trở lên và chỉ chọn hoặc truy xuất những tài liệu khớp với ít nhất một trong các biểu thức đã cho trong mảng.

Làm cách nào để sử dụng $set trong MongoDB?

Toán tử $set thay thế giá trị của một trường bằng giá trị đã chỉ định . Biểu thức toán tử $set có dạng như sau. { $set. {