Meteor 流星收集转换检查其他收集,奇怪的行为
Meteor集合“客户端”是集合“项目”的父级 项目中的外键为“客户id” 现在我想用客户机名称扩展Projects集合。如果没有客户端父级,则将客户端名称设为“XXX”。 (很容易看到“孤立”项目:只需以XXX作为客户名称即可) Meteor代码如下: collections.jsMeteor 流星收集转换检查其他收集,奇怪的行为,meteor,Meteor,Meteor集合“客户端”是集合“项目”的父级 项目中的外键为“客户id” 现在我想用客户机名称扩展Projects集合。如果没有客户端父级,则将客户端名称设为“XXX”。 (很容易看到“孤立”项目:只需以XXX作为客户名称即可) Meteor代码如下: collections.js Client = new Mongo.Collection('clients'); Project = new Mongo.Collection('projects', { transform:
Client = new Mongo.Collection('clients');
Project = new Mongo.Collection('projects', {
transform: function (doc) {
var client = Client.findOne({"_id":doc.client_id},{"_id":0, "name":1});
if (!client) {
// Client name is 'XXX'
return _.extend(doc, {"client_name":"XXX"});
} else {
return _.extend(doc, {"client_name":client.name});
}
}
}
);
Meteor.publish('clientNewYork', function () {
// This publication only New York clients, and only the name.
return Client.find({"city":"New York"}, {fields: {"name": 1}}, {sort: name: -1});
});
Meteor.publish('projects', function () {
return Project.find();
});
Meteor.subscribe('clientNewYork');
Meteor.subscribe('projects');
publications.js
Client = new Mongo.Collection('clients');
Project = new Mongo.Collection('projects', {
transform: function (doc) {
var client = Client.findOne({"_id":doc.client_id},{"_id":0, "name":1});
if (!client) {
// Client name is 'XXX'
return _.extend(doc, {"client_name":"XXX"});
} else {
return _.extend(doc, {"client_name":client.name});
}
}
}
);
Meteor.publish('clientNewYork', function () {
// This publication only New York clients, and only the name.
return Client.find({"city":"New York"}, {fields: {"name": 1}}, {sort: name: -1});
});
Meteor.publish('projects', function () {
return Project.find();
});
Meteor.subscribe('clientNewYork');
Meteor.subscribe('projects');
subscriptions.js
Client = new Mongo.Collection('clients');
Project = new Mongo.Collection('projects', {
transform: function (doc) {
var client = Client.findOne({"_id":doc.client_id},{"_id":0, "name":1});
if (!client) {
// Client name is 'XXX'
return _.extend(doc, {"client_name":"XXX"});
} else {
return _.extend(doc, {"client_name":client.name});
}
}
}
);
Meteor.publish('clientNewYork', function () {
// This publication only New York clients, and only the name.
return Client.find({"city":"New York"}, {fields: {"name": 1}}, {sort: name: -1});
});
Meteor.publish('projects', function () {
return Project.find();
});
Meteor.subscribe('clientNewYork');
Meteor.subscribe('projects');
应用程序从第一个订阅开始:纽约所有客户端的列表。
下一个屏幕是所有项目,用客户机名称充实。
重要提示:所有项目,不仅仅是纽约客户的项目
奇怪的事情发生了:
所有不在纽约的客户项目都以“XXX”作为客户名称。
这意味着在转换集合时会考虑发布
我的怀疑:
在我的浏览器中,非纽约客户不在MiniMongo中。
但是我希望collection.js会进入服务器上运行的数据库,而不是浏览器上的minimongo
解决方法:
将客户端发布更改为所有客户端,而不仅仅是纽约客户端。
但我的感觉是这样不好
我做错什么了吗 每次获取文档时,都会对其运行转换。你的怀疑是对的: 在客户机上获取项目文档时,每个文档都会查找相应的客户机文档。因为客户端上的
find
会命中minimongo,所以只会匹配已发布的客户端(在您的案例中是纽约客户端)
如果不了解更多的实施细节,就很难提出精确的解决方案。一些选择包括:
client\u name
字段来反规范化数据(避免转换)。缺点是,无论何时更新客户名称,都需要更新相应的项目。看一看