【问题标题】:Node.js Fetch last week dataNode.js 获取上周数据
【发布时间】:2017-12-28 15:07:55
【问题描述】:

我的猫鼬模式结构有点像这样:

{
    "_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
        }
    ]
}

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

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

第二个问题,是否有更合适的方式来创建架构并进行查询。(我创建了子架构账单,以便与特定 id 相关的所有账单都保留在一个地方,以便于查询。这效率高吗?)。

欢迎各种建议。提前致谢。

【问题讨论】:

  • 使用$filter根据查询条件过滤账单。

标签: node.js database mongodb mongoose


【解决方案1】:

您可以在 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);
        }
    });

【讨论】:

  • 我想要某个特定 ID 的上周账单。假设 _id "123" 查找上周的所有账单。不是上周的整体账单。
  • 嗨,请参阅更新的答案,我已经更新了单个 id 的代码。希望对你有帮助
  • 我已经投票了,但这不是我想要的。我想知道我的模式是否有效,但事实并非如此。正如我所提到的,票据子模式可能太大,嵌入模式中不是一个好习惯。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多