Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Javascript 选择collection并获取MongoDB中其他集合中每个集合的最后一项_Javascript_Mongodb_Reactjs_Meteor - Fatal编程技术网

Javascript 选择collection并获取MongoDB中其他集合中每个集合的最后一项

Javascript 选择collection并获取MongoDB中其他集合中每个集合的最后一项,javascript,mongodb,reactjs,meteor,Javascript,Mongodb,Reactjs,Meteor,我用下面的代码订阅了该出版物。所以在我的服务器端文件中 Meteor.publish('people', function() { cursor = EmailDB.find({category:{$ne:"Spammer"}},{sort:{"lastMessage.date": -1},limit:20}); let transformData = (fields) => { // this is the person we're

我用下面的代码订阅了该出版物。所以在我的服务器端文件中

Meteor.publish('people', function() {
    cursor = EmailDB.find({category:{$ne:"Spammer"}},{sort:{"lastMessage.date": -1},limit:20});
        let transformData = (fields) => {
                // this is the person we're processing now
                let eadd = fields.eadd;

                // get the latest message for this person
                key.eadd = eadd;
                let lastMessage = MessageDB.findOne(key,
                    {
                        sort: {date: -1}
                    }
                );

                // add his last message to the returned data
                fields.lastMessage = lastMessage;

                return fields;
            };

            let handle = cursor.observeChanges({
                added: (id, fields) => {
                fields = transformData(fields);
            this.added('emails', id, fields);
        },
            changed: (id, fields) => {
                fields = transformData(fields);
                this.changed('emails', id, fields);
            },
            removed: (id) => {
                this.removed('emails', id);
            }
        });

            this.ready();

            this.onStop(() => {
                handle.stop();
        });
        return cursor;
}
它可以得到所有人的记录。 我想得到每个人的最新消息。 所以我使用了上面的代码,但它不起作用,它没有向我的查询中添加额外的字段


我只需要订阅并获取所有记录,每个记录中必须有最后一条消息

如果不是这样,您需要在MessagesDB中添加PersonDB Id

MessagesDB.find({PersonDB:PersonDB._id},{limit:1}).fetch()[0]

无论何时,只要您希望像这样连接来自2个已发布集合的数据,您都可以选择在客户端或服务器上进行连接。如果您在客户机上这样做,那么您已经为自己创建了一个竞争条件。这是可以解决的,但我发现它更干净,更容易在服务器上完成。而且它使客户端非常简单,因为您只需要订阅一个集合

因此,要在服务器上执行此操作,您可以在发布中处理它。在那里,您可以转换返回的集合PersonDB并向其添加数据MessagesDB

我不知道你的收藏是什么样子,或者它们是如何命名的,所以我显然在这里做一些假设

Meteor.publish('people', function() {
    let cursor = PersonDB.find({});

    let transformData = (fields) => {
        // this is the person we're processing now
        let personId = fields.personId;

        // get the latest message for this person
        let lastMessage = MessagesDB.findOne({personId: personId},
            {
                sort: {createdAt: -1}
            }
        );

        // add his last message to the returned data
        fields.lastMessage = lastMessage;

        return fields;
    };

    let handle = cursor.observeChanges({
        added: (id, fields) => {
            fields = transformData(fields);
            this.added('personsdb', id, fields);
        },
        changed: (id, fields) => {
            fields = transformData(fields);
            this.changed('personsdb', id, fields);
        },
        removed: (id) => {
            this.removed('personsdb', id);
        }
    });

    this.ready();

    this.onStop(() => {
        handle.stop();
    });
});

在客户端上,您可以像普通一样订阅PersonDB,并像普通一样进行查找,现在在每条记录上都会附加一个lastMessage字段。

您需要给我一个文档示例,您是否使用ObjectId作为您的id?是。仅在person集合上。消息集合,不是。这还没有解决。如果我在PersonDB中添加了一个过滤器,会怎么样?例如,我想获取今天创建的人员列表?您可以执行PersonDB.find{createdAt:new Date}。获取我将返回什么?我不理解您的问题。你的意思是我在上面写的那篇文章会给你带来什么?没什么,它应该像我写的那样工作。我使用了return cursor或return PersonDB.find{}。我订阅了。但现在的问题是,没有将最新消息添加到每一项中。@JohnArellano,用您的代码更新您的问题,就像现在一样。@JohnArellano,我只是猜测您已调用了您的收集人员数据库。这就是它的名字吗?否则,将永远不会调用添加、更改和删除的侦听器。