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

Nhóm theo ngày với nhiều trường ngày

Bạn cũng có thể tách các tài liệu tại nguồn, về cơ bản bằng cách kết hợp mỗi giá trị thành một mảng các mục nhập theo "loại" cho "vào" và "ra". Bạn có thể thực hiện việc này đơn giản bằng cách sử dụng $map $cond để chọn các trường, sau đó $unwind mảng và sau đó xác định trường nào cần "đếm" lại bằng cách kiểm tra với $cond :

collection.aggregate([
  { "$project": {
    "dates": {
      "$filter": {
        "input": { 
          "$map": {
            "input": [ "in", "out" ],
            "as": "type",
            "in": {
              "type": "$$type",
              "date": {
                "$cond": {
                  "if": { "$eq": [ "$$type", "in" ] },
                  "then": "$inDate",
                  "else": "$outDate"
                }
              }
            }
          }
        },
        "as": "dates",
        "cond": { "$ne": [ "$$dates.date", null ] }
      }
    }
  }},
  { "$unwind": "$dates" },
  { "$group": {
    "_id": {
      "year": { "$year": "$dates.date" },
      "month": { "$month": "$dates.date" },
      "day": { "$dayOfMonth": "$dates.date" }
    },
    "countIn": {
      "$sum": {
        "$cond": {
          "if": { "$eq": [ "$dates.type", "in" ]  },
          "then": 1,
          "else": 0
        }
      }
    },
    "countOut": {
      "$sum": {
        "$cond": {
          "if": { "$eq": [ "$dates.type", "out" ]  },
          "then": 1,
          "else": 0
        }
      }
    }
  }}
])

Đó là một cách an toàn để làm điều này mà không có nguy cơ phá vỡ giới hạn BSON, bất kể kích thước dữ liệu bạn gửi ở đó là bao nhiêu.

Cá nhân tôi muốn chạy dưới dạng các quy trình riêng biệt và "kết hợp" các kết quả tổng hợp một cách riêng biệt, nhưng điều đó sẽ phụ thuộc vào môi trường bạn đang chạy, điều này không được đề cập trong câu hỏi.

Đối với ví dụ về thực thi "song song", bạn có thể cấu trúc trong Meteor ở đâu đó dọc theo các dòng sau:

import { Meteor } from 'meteor/meteor';
import { Source } from '../imports/source';
import { Target } from '../imports/target';

Meteor.startup(async () => {
  // code to run on server at startup

  await Source.remove({});
  await Target.remove({});

  console.log('Removed');

  Source.insert({
    "_id" : "XBpNKbdGSgGfnC2MJ",
    "po" : 72134185,
    "machine" : 40940,
    "location" : "02A01",
    "inDate" : new Date("2017-07-19T06:10:13.059Z"),
    "requestDate" : new Date("2017-07-19T06:17:04.901Z"),
    "outDate" : new Date("2017-07-19T06:30:34Z")
  });

  console.log('Inserted');

  await Promise.all(
    ["In","Out"].map( f => new Promise((resolve,reject) => {
      let cursor = Source.rawCollection().aggregate([
        { "$match": { [`${f.toLowerCase()}Date`]: { "$exists": true } } },
        { "$group": {
          "_id": {
            "year": { "$year": `$${f.toLowerCase()}Date` },
            "month": { "$month": `$${f.toLowerCase()}Date` },
            "day": { "$dayOfYear": `$${f.toLowerCase()}Date` }
          },
          [`count${f}`]: { "$sum": 1 }
        }}
      ]);

      cursor.on('data', async (data) => {
        cursor.pause();
        data.date = data._id;
        delete data._id;
        await Target.upsert(
          { date: data.date },
          { "$set": data }
        );
        cursor.resume();
      });

      cursor.on('end', () => resolve('done'));
      cursor.on('error', (err) => reject(err));
    }))
  );

  console.log('Mapped');

  let targets = await Target.find().fetch();
  console.log(targets);

});

Về cơ bản, nó sẽ xuất ra tập hợp mục tiêu như đã được đề cập trong các nhận xét như:

{
        "_id" : "XdPGMkY24AcvTnKq7",
        "date" : {
                "year" : 2017,
                "month" : 7,
                "day" : 200
        },
        "countIn" : 1,
        "countOut" : 1
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lỗi khi cài đặt trình điều khiển mongo cho PHP trên amazon linux

  2. Cách lấy một luồng nhị phân bằng GridFS ObjectId với Spring Data MongoDB

  3. Nodejs Mongo chèn vào subocument - Tên trường động

  4. Làm thế nào để bạn kết xuất nhiều mẫu với một bộ điều khiển tuyến đường sử dụng bộ định tuyến sắt?

  5. Quản lý nhiều công nghệ cơ sở dữ liệu với ClusterControl