繁体   English   中英

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

[英]select collection and get the last item of each in other collection in MongoDB

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

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;
}

它获取Person的所有记录。 我想获取每个人的最新消息。 所以我使用了上面的代码,但是它不起作用,它没有向我的查询中添加其他字段。

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

每当您想要从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”字段。

您需要在MessagesDB中添加PersonDB ID(如果不是这种情况)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM