使用MeteorJS,我有一组逮捕,其中包含一组已保存特定逮捕的userIds。使用此方法添加这些userId:
saveArrest: function(arrestId) {
check(this.userId, String);
check(arrestId, String);
var affected = Arrests.update({
_id: arrestId,
savers: {$ne: this.userId}
}, {
$addToSet: {savers: this.userId},
$inc: {saves: 1}
});
if(! affected)
throw new Meteor.Error('invalid', "You weren't able to save that arrest");
},
我正在尝试使用铁路由器的路由控制器中的数据功能查找登录用户已保存的逮捕。
以下是两个涉及的控制器:
ArrestsNewController = RouteController.extend({
template: 'arrestsNew',
increment: 16,
arrestsLimit: function() {
return parseInt(this.params.arrestsLimit) || this.increment;
},
findOptions: function() {
return {sort: this.sort, limit: this.arrestsLimit()};
},
searchOptions: function() {
return this.search;
},
subscriptions: function() {
this.postsSub = Meteor.subscribe('arrestsNew', this.findOptions());
},
arrests: function() {
return Arrests.find(this.searchOptions(), this.findOptions());
},
data: function() {
var hasMore = this.arrests().count() === this.arrestsLimit();
var nextPath = this.route.path({arrestsLimit: this.arrestsLimit() + this.increment});
return {
arrests: this.arrests(),
ready: this.postsSub.ready,
nextPath: hasMore ? this.nextPath() : null
};
}
});
MyArrestsController = ArrestsNewController.extend({
sort: {saves: -1, system_id: -1},
search: {savers : {$in : [this.userId]}},
nextPath: function() {
return Router.routes.myArrests.path({arrestsLimit: this.arrestsLimit() + this.increment})
}
});
我认为问题出在搜索:在MyArrestController中。即使登录用户被逮捕,也不会返回任何逮捕。非常感谢任何帮助。
答案 0 :(得分:0)
因此,在保存时,您有savers: {$ne: this.userId}
- 表示“如果该字段不等于用户ID则更新”,并且在查询时您有search: {savers : {$in : [this.userId]}}
- 表示“如果userId在数组内,则获取数据保护程序”。
什么是储户?字段或数组?我假设你想要数组,所以你应该使用$nin
。文档:http://docs.mongodb.org/manual/reference/operator/query/nin/
你在if(! affected)
上有一个错误,你需要传递一个回调来检查结果异步,而不是同步。文档:http://docs.meteor.com/#/basic/Mongo-Collection-update
同时检查wrapAsync:http://docs.meteor.com/#/full/meteor_wrapasync
我自然而然地接受编写代码的新方法,但我从未将逻辑代码放在RouteController中。我最常用的操作类型是waitOn(订阅数据),数据,onBeforeAction,onAfterAction和onStop。我只把它用于路线,而不是逻辑,但当然,这只是一个品味问题。
我觉得将“控制器”放在模板助手附近更清洁,更容易。
您是否在路线定义中声明MyArrestsController
作为路径控制器?
this.route('arrest', {
path: '/arrests',
controller: 'MyArrestsController'
});
在this.postsSub = Meteor.subscribe('arrestsNew', this.findOptions());
上,您不是在等待数据可用。