我的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相关的账单保留在一个地方,因此很容易查询。这有效吗?)。
对所有建议开放。提前谢谢。
答案 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);
}
});