gpt4 book ai didi

mongodb - Meteor 和 DBRefs

转载 作者:IT老高 更新时间:2023-10-28 13:14:22 25 4
gpt4 key购买 nike

我在 Win7(32) 中使用 meteor 0.3.7 并尝试使用 2 个 MongoDB 集合创建一个简单的日志系统来存储由 DBRef 链接的数据。

当前的伪模式是:

    Users {
username : String,
password : String,
created : Timestamp,
}

Logs {
user_id : DBRef {$id, $ref}
message : String
}

我使用服务器方法插入日志,这样我就可以对客户端集合进行一些更新。

现在我想做一个旧的“左连接”并显示一个包含嵌入用户名的最后 n 个日志的列表。我不想在用户中嵌入日志,因为最常用的操作是获取最后 n 个日志。在我看来,嵌入将对性能产生重大影响。

实现这一目标的最佳方法是什么?

接下来,如果可以编辑用户名并且所有项目都更改名称,那就太好了

问候

最佳答案

玩 Cursor.observe 回答了我的问题。这可能不是最有效的方法,但解决了我 future 取消引用 DBRefs“链接”的问题

所以对于服务器我们需要发布一个特殊的集合。一个可以枚举游标并为每个文档搜索相应的DBRef。请记住,这个实现是硬编码的,应该像 UnRefCollection 这样的包来完成。

服务器端

    CC.Logs = new Meteor.Collection("logs");
CC.Users = new Meteor.Collection("users");

Meteor.publish('logsAndUsers', function (page, size) {
var self = this;
var startup = true;
var startupList = [], uniqArr = [];

page = page || 1;
size = size || 100;
var skip = (page - 1) * size;

var cursor = CC.Logs.find({}, {limit : size, skip : skip});
var handle = cursor.observe({
added : function(doc, idx){
var clone = _.clone(doc);
var refId = clone.user_id.oid; // showld search DBRefs
if (startup){
startupList.push(clone);
if (!_.contains(uniqArr, refId))
uniqArr.push(refId);
} else {
// Clients added logs
var deref = CC.Users.findOne({_id : refid});
clone.user = deref;
self.set('logsAndUsers', clone._id, clone);
self.flush();
}
},
removed : function(doc, idx){
self.unset('logsAndUsers', doc._id, _.keys(doc));
self.flush();
},
changed : function(new_document, idx, old_document){
var set = {};
_.each(new_document, function (v, k) {
if (!_.isEqual(v, old_document[k]))
set[k] = v;
});
self.set('logsAndUsers', new_document._id, set);
var dead_keys = _.difference(_.keys(old_document), _.keys(new_document));
self.unset('logsAndUsers', new_document._id, dead_keys);
self.flush();
},
moved : function(document, old_index, new_index){
// Not used
}
});

self.onStop(function(){
handle.stop();
});

// Deref on first Run
var derefs = CC.Users.find({_id : {$in : uniqArr} }).fetch();
_.forEach(startupList, function (item){
_.forEach(derefs, function(ditems){
if (item["user_id"].oid === ditems._id){
item.user = ditems;
return false;
}
});
self.set('logsAndUsers', item._id, item);
});
delete derefs; // Not needed anymore

startup = false;
self.complete();
self.flush();
});

对于每个添加的日志文档,它将搜索用户集合并尝试将丢失的信息添加到日志集合中。在第一次运行时为日志集合中的每个文档调用添加的函数我创建了一个 startupList 和一个唯一用户 ID 数组,因此在第一次运行时它只会查询一次数据库。放一个分页机制来加快速度是个好主意。

客户端

在客户端,订阅 logsAndUsers 集合,如果您想直接对 Logs 集合进行更改。

LogsAndUsers = new Meteor.collection('logsAndUser');
Logs = new Meteor.colection('logs'); // Changes here are observed in the LogsAndUsers collection

Meteor.autosubscribe(function () {
var page = Session.get('page') || 1;
Meteor.subscribe('logsAndUsers', page);
});

关于mongodb - Meteor 和 DBRefs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com