MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Dữ liệu phân vùng xung quanh truy vấn đối sánh trong quá trình tổng hợp

Sự kết hợp này cho kết quả mong muốn.

db.posts.aggregate( [
{ $match:  { updatedAt: { $gte: 1549786260000 } } },
{ $facet: {
        FALSE: [
            { $match: { toggle: false } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : 1 } } },
        ],
        TRUE: [
            { $match: { toggle: true, status: "INACTIVE" } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : -1 } } },
        ]
} },
{ $project: { result: { $concatArrays: [ "$FALSE", "$TRUE" ] } } },
{ $unwind: "$result" },
{ $replaceRoot: { newRoot: "$result" } },
{ $group : { _id : "$_id", count: { $sum : "$count" } } },
{ $project:{ _id: 0, iid: "$_id.iid", pid: "$_id.pid", count: 1 } }
] )


[CHỈNH SỬA THÊM]

Đầu ra từ truy vấn sử dụng dữ liệu đầu vào từ bài đăng câu hỏi:

{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }


[CHỈNH SỬA THÊM 2]

Truy vấn này nhận được cùng một kết quả với cách tiếp cận (mã) khác nhau:

db.posts.aggregate( [
  { 
      $match:  { updatedAt: { $gte: 1549786260000 } } 
  },
  { 
      $unwind : "$interests" 
  },
  { 
      $group : { 
          _id : { 
              iid: "$interests", 
              pid: "$publisher" 
          }, 
          count: { 
              $sum: {
                  $switch: {
                      branches: [
                        { case: { $eq: [ "$toggle", false ] },
                           then: 1 },
                        { case: { $and: [ { $eq: [ "$toggle", true] },  { $eq: [ "$status", "INACTIVE" ] } ] },
                           then: -1 }
                      ]
                  }          
              } 
          }
      } 
  },
  { 
      $project:{
           _id: 0, 
           iid: "$_id.iid", 
           pid: "$_id.pid", 
           count: 1 
      } 
  }
] )


[CHỈNH SỬA THÊM 3]

LƯU Ý:

Truy vấn khía cạnh chạy hai khía cạnh (TRUE và FALSE) trên cùng một bộ tài liệu; nó giống như hai truy vấn chạy song song. Tuy nhiên, có một số mã trùng lặp cũng như các giai đoạn bổ sung để định hình các tài liệu theo đường dẫn để có được đầu ra mong muốn.

Truy vấn thứ hai tránh trùng lặp mã và có ít giai đoạn hơn trong quy trình tổng hợp. Điều này sẽ tạo ra sự khác biệt khi tập dữ liệu đầu vào có một số lượng lớn tài liệu cần xử lý - về mặt hiệu suất. Nói chung, các giai đoạn nhỏ hơn có nghĩa là ít lần lặp lại tài liệu hơn (vì một giai đoạn phải quét các tài liệu được xuất ra từ giai đoạn trước).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. So sánh hai mảng đối tượng và kiểm tra xem chúng có các phần tử chung không

  2. Mongodb x.509 'Không có tên chủ đề đã xác minh nào từ ứng dụng khách'

  3. Chuyển đổi DBObject thành POJO bằng Trình điều khiển Java MongoDB

  4. Lời khuyên cần thiết:Cách kết nối đúng cách React với MongoDB

  5. Nhiều $ regex sử dụng $ và trong MongoDB