Node.js获取上周数据

时间:2017-12-27 09:22:39

标签: node.js database mongodb mongoose

我的mongoose架构有点像这样:

{
    "_id": {
        "$oid": "59d00283893f4500127271f6"
    },
    "__v": 0,
    "bills": [
        {
            "timestamp": 1513539218509,
            "table_no": 2,
            "user_id": {
                "$oid": "59cf912782b85b0012860ecc"
            },
            "order_id": {
                "$oid": "5a36c5979a54980014f06787"
            },
            "_id": {
                "$oid": "5a36c6929a54980014f0678b"
            },
            "disc_amount": 320,
            "amount": 320
        },
        {
            "timestamp": 1513539299486,
            "table_no": 2,
            "user_id": {
                "$oid": "59cf912782b85b0012860ecc"
            },
            "order_id": {
                "$oid": "5a36c6c99a54980014f0678c"
            },
            "_id": {
                "$oid": "5a36c6e39a54980014f0678f"
            },
            "disc_amount": 160,
            "amount": 160
        },
        {
            "timestamp": 1513540879109,
            "table_no": 2,
            "user_id": {
                "$oid": "59cf912782b85b0012860ecc"
            },
            "order_id": {
                "$oid": "5a36ccfb9a54980014f06790"
            },
            "_id": {
                "$oid": "5a36cd0f9a54980014f06793"
            },
            "disc_amount": 320,
            "amount": 320
        },
        {
            "timestamp": 1513540986507,
            "table_no": 2,
            "user_id": {
                "$oid": "59cf912782b85b0012860ecc"
            },
            "order_id": {
                "$oid": "5a36cd639a54980014f06794"
            },
            "_id": {
                "$oid": "5a36cd7a9a54980014f06797"
            },
            "disc_amount": 240,
            "amount": 320
        }
    ]
}

从子模式账单我只想获取那些只有一周的账单。

我的第一个问题是,首先通过id找到Schema,然后获取账单并在账单数组中进行处理以仅获取上周数据。我想这不会有效,因为子模式账单可能太大,因此,获取整个数组不是一个好主意。那么,正确的方法是什么?

和第二个问题,是否有更合适的方法来创建架构并进行查询。(我创建了子模式账单,以便所有与特定ID相关的账单保留在一个地方,因此很容易查询。这有效吗?)。

对所有建议开放。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以在mongoose中为集合创建模型,并按如下方式使用它:

var start = new Date(new Date().getTime() - (7 * 60 * 60 * 24 * 1000));  // get date of last week
  Bill.find({
    'bills.timestamp' : {"$gte": start.getTime()}
  }, {
    // Only include the subdocument(s) that matched the query.
    'bills.$'    : 1
  }, function(err, data){
    console.log(data)
  });

型号:

var mongoose = require('mongoose');

/**
 * Bill Mongo DB model
 * @name billModel
 */
var billModel = function () {

    var billSchema = mongoose.Schema({

    bills:{ type : Array , "default" : [] }

    });


  return mongoose.model('Bill', billSchema);
};

module.exports = new billModel();

对于单个ID,可以使用以下代码:

Bill.aggregate([
        {
            $match: {
                '_id': new mongoose.Types.ObjectId('5968dcf965854c7817606014')
            }
        },
        {
          $project: {
             bills: {
                $filter: {
                   input: "$bills",
                   as: "bill",
                   cond: { $gte: [ "$$bill.timestamp", start.getTime() ] }
                }
             }
          }
        },
    ], function (err, result) {
        if (err) {
            console.log(err);
        } else {
            res.json(result);
        }
    });