Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 流星收集转换检查其他收集,奇怪的行为_Meteor - Fatal编程技术网

Meteor 流星收集转换检查其他收集,奇怪的行为

Meteor 流星收集转换检查其他收集,奇怪的行为,meteor,Meteor,Meteor集合“客户端”是集合“项目”的父级 项目中的外键为“客户id” 现在我想用客户机名称扩展Projects集合。如果没有客户端父级,则将客户端名称设为“XXX”。 (很容易看到“孤立”项目:只需以XXX作为客户名称即可) Meteor代码如下: collections.js Client = new Mongo.Collection('clients'); Project = new Mongo.Collection('projects', { transform:

Meteor集合“客户端”是集合“项目”的父级 项目中的外键为“客户id”

现在我想用客户机名称扩展Projects集合。如果没有客户端父级,则将客户端名称设为“XXX”。 (很容易看到“孤立”项目:只需以XXX作为客户名称即可)

Meteor代码如下:

collections.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');
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
    字段来反规范化数据(避免转换)。缺点是,无论何时更新客户名称,都需要更新相应的项目。看一看

  • 为客户端提供更灵活的发布功能。如果可以标识当前项目或当前项目集,则可以在订阅时将id或id数组传递给发布函数。通过这种方式,您仍然可以加入这两个集合,而无需发布整个客户端文档集