使用mongoose为NodeJS创建数组Schema数组

时间:2016-08-25 10:03:44

标签: javascript node.js mongodb mongoose mongoose-schema

我想创建一个DB Schema来存储数据,如下所示

{
    name : "xyz",
    admin : "admin",
    expense : [ 
                jan: [{expenseObject},{expenseObject}], 
                feb: [[{expenseObject},{expenseObject}]
              ]
}

费用对象

var expenseSchema = new Schema({
    particular : String,
    date : {type : Date, default: Date.now},
    paid_by : String,
    amount : Number
});

有人可以帮我创建相同的架构。

欢迎任何有关同一概念的更好Schema的建议。

2 个答案:

答案 0 :(得分:0)

您可以使用Sub Docs

var parentSchema = new Schema({
  name: { type: String },
  admin: { type: String },
  expense: [expenseSchema]
});

或者,如果您需要将expenseObjects存储在单独的集合中,您可以使用refs,其中Expense将是另一个模型的名称

var parentSchema = new Schema({
  name: { type: String },
  admin: { type: String },
  expense: [{ type: Schema.Types.ObjectId, ref: 'Expense' }],
});

答案 1 :(得分:0)

var expenseSchema = new Schema({
  particular : String,
  date : {type : Date, default: Date.now},
  paid_by : String,
  amount : Number
});

// your schema
var mySchema = new Schema({
   name : {type: String, trim: true},
   admin : {type: String, trim: true},
   expense: [expenseSchema]
});

---更新:

现在更新expense是一个expenseSchema的数组,没有任何月份分类。然后,如果你想获得特定月份的所有费用,你可以简单地进行这样的聚合:

db.users.aggregate(
  [
   // this match is for search the user
   { $match: { name: "<ADMIN NAME>"} },
   // this unwind all expenses of the user selected before
   { $unwind: "$expense" },
   // this project the month number with the expense
   {
     $project: {
      expense: 1, 
      month: {$month: '$expense.date'}
    }
   },
   // this search all the expenses in a particular month (of the user selected before)
   { $match: { month: 8 } },
   // this is optional, it's for group the result by _id of the user
   //(es {_id:.., expenses: [{}, {}, ...]}. Otherwise the result is a list of expense
   {
    $group: {
      _id:"$month",
      expenses: { $addToSet: "$expense"}
    }
  }
 ]);