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

Tương tự cho kết nối nhóm trong sql

Theo các nhận xét cho đến nay, vẫn chưa rõ bạn đang nhóm gì hoặc kết quả cuối cùng là gì, ngoài việc nói rằng bạn muốn ghép các ngày của mình thành một cái gì đó như "chỉ trong ngày" không có giờ hoặc phút. Có lẽ bạn muốn những ngày riêng biệt đó vì mục đích nào đó.

Có nhiều Toán tử Ngày khác nhau trong đường dẫn bạn có thể sử dụng vào các ngày và là $ concat cả nhà điều hành. Rất tiếc, tất cả Toán tử ngày tạo ra một số nguyên là kết quả của chúng và đối với loại chuỗi Ngày bạn muốn, $ concat sẽ chỉ hoạt động với chuỗi. Vấn đề khác là bạn không thể truyền số nguyên thành một loại chuỗi trong tổng hợp.

Nhưng bạn có thể sử dụng tài liệu phụ, ở đây chúng tôi sẽ chỉ làm việc với ngày:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Vì vậy, nó không phải là một chuỗi, nhưng nó có thể dễ dàng được xử lý sau thành một chuỗi, nhưng quan trọng nhất là nó được nhóm lại và có thể sắp xếp.

Các nguyên tắc vẫn giữ nguyên nếu bạn muốn các dates duy nhất theo cách này dưới dạng một mảng ở cuối hoặc bạn muốn nhóm các tổng theo những ngày đó. Vì vậy, trước hết hãy ghi nhớ các phần $ unwind và $ project bằng cách sử dụng các toán tử ngày.

--EDIT--

Với lời cảm ơn đến cộng đồng như được thể hiện trong bài đăng này có cái này không có giấy tờ hành vi của $ substr , trong đó số nguyên có thể được truyền dưới dạng chuỗi.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Và bây giờ là dates là các chuỗi. Như tôi đã lưu ý trước đây, nếu thứ tự quan trọng đối với bạn thì cách tiếp cận tốt nhất là chiếu vào một loại tài liệu như đã được thực hiện và sắp xếp trên các phím số. Đương nhiên, dự án $ chuyển đổi ngày tháng có thể được chuyển thành giai đoạn nhóm $ cho ngắn gọn, đây có thể là điều bạn muốn làm khi làm việc với toàn bộ tài liệu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose dường như thất bại một cách lặng lẽ

  2. Cơ sở dữ liệu sử dụng JSON làm định dạng lưu trữ / truyền tải

  3. mongodb Java Driver - $ group với nhiều trường

  4. Có kích thước bson tối đa MongoDB hoạt động xung quanh không?

  5. MongoDB - tài liệu người dùng của tôi có nên chứa danh sách id dự án không?