我有一个Mongo项目(项目)集合。我有另一个与项目关联的权限集合(item_ownership),一个这样的权限存储拥有项目的用户的ID(owner_id)。我想获取用户拥有的所有项目并发布它们。 所以,从理论上讲,我想首先从" item_ownership'中选择item_id。然后可以将该集合插入到'项目的查询中。集合来过滤它。此筛选结果集将发布到浏览器:
Items = new Mongo.Collection("items");
ItemOwnership = new Mongo.Collection("item_ownership");
Meteor.publish('items_pub', function() {
var itemOwnershipColl = ItemOwnership.find(
{
owner_id: Meteor.userId()
},
{
fields: { item_id: 1 }
}
);
// Compile list of items to return.
var item_id_array = [];
itemOwnershipColl.forEach(function (record) {
item_id_array[item_id_array.length] = record.item_id;
});
return Items.find(
{
item_id: { $in: item_id_array }
},
{
sort: {
item_order: 1
}
}
);
});
这是最好的方法吗?
答案 0 :(得分:2)
reywood:publish-composite package非常适合处理数据模型中的此类关系。
答案 1 :(得分:1)
如果我正确理解您的架构,看起来您的联接几乎是正确的。这是编写它的一种方法:
Meteor.publish('items_pub', function() {
var selector = {owner_id: this.userId};
var items = ItemOwnership.find(selector, {fields: {item_id: 1}}).fetch();
var itemIds = _.pluck(items, '_id');
return Items.find({_id: {$in: itemIds}});
});
它与您的代码基本相同,只有一些快捷方式更正:
fetch
。没有它,你就无法访问这些文件。_.pluck
是一种将ID提取到数组中的简便方法。limit
或skip
结合使用。见common mistakes。_id
而不是item_id
。还值得注意的是,使用mongodb时通常不需要这种联接集合(ItemOwnership)。更好的解决方案可能是在用户上存储项目数组,或者在项目上存储一组用户。