遵循优秀的Meteor Guide我试图扩展收藏。我的最终目标是创建在更新值时立即管理插入和更新的对象。我用我的Order
课程尝试了这个:
Order = class Order {
constructor(customerId, orderDate){
this.document = {};
this.document.customerId = customerId;
this.document.orderDate = orderDate;
this.document._id = Orders.insert(this.document);
}
// some class methods go here.
}
我的orders
由客户ID和日期唯一定义。所以你不能在同一天发两个订单。因此,我使用自己的Mongo.Collection
课程扩展了OrderCollection
课程。这种抽象数据层以确保其中的数据保持唯一的关键:
class OrderCollection extends Mongo.Collection{
constructor(collectionName){
super(collectionName);
this.attachSchema(
new SimpleSchema({
customerId: { type: String },
orderDate: { type: Date }
})
);
}
insert(list, callback){
// check if the actual order already exists
if (list._id){
return _id;
}
// we won't insert a new order if a matching one exists.
var order = Orders.findOne({
customerId: list.customerId,
orderDate: list.orderDate
});
if (order){return order._id;}
// create order and return it.
return super.insert(list, callback);
}
remove(selector, callback){
return super.remove(selector, callback);
}
}
Orders = new OrderCollection("orders");
这一切似乎都有效。当我创建一个新订单时,它要么创建一个新订单,要么返回具有正确_id的现有订单。因此,例如当我运行meteor reset
然后输入新订单时,我检索与停止流星时相同的_id
,重新启动它并再次尝试相同的插入:
{ document:
{ customerId: 'QB6rEEJirGXS3oj6R',
orderDate: Fri Jan 29 2016 00:00:00 GMT+0000 (GMT),
_id: 'AwmygYsPnxR86Ks6D' } }
这一切都很好并且表现得如预期的那样。但我似乎无法通过订阅或在客户端上调用Orders.find({}).fetch()
来检索任何对象。
即使是msavin:mongol告诉我Orders集合是空的,即使我通过monogl接口向它添加新项目,它们也不会出现。我做错了什么?
更新
我正在使用SimpleSchema和Collections2,并想知道他们是否可能不支持我使用它的方式。
答案 0 :(得分:0)
这是初学者的问题。以上都有效,问题在于客户端的订阅,而不是instance.autorun(function...)
我写的instance.autorun = function...