Meteor获取第一个集合的值,以查找其他集合的值

时间:2015-10-26 09:46:19

标签: javascript mongodb meteor

所以我有两个系列:

  1. 用户,包含userId,firstname,surname。
  2. 答案,包含answerId,questionId和user。
  3. 'Answers'集合中的'user'字段指的是回答问题的用户的userId。

    我可以从answers集合返回userId,但现在我想使用userId从Users集合中找到Firstname en姓氏。

    另一个解决方案可能是不将userId插入Answers集合,而是将firstname和surname插入。但我也不知道如何实现这一目标。

    我希望你理解我的问题,希望有人能帮助我!

    此致, →

2 个答案:

答案 0 :(得分:1)

您应该能够使用 forEach() 方法遍历Answers集合中的每个答案文档,通过搜索Users找到相关的用户文档id的集合,如下例所示:

Answers = new Meteor.Collection("answers");
Users = new Meteor.Collection("users");

if(Meteor.isClient) {
    processed_data = []; 

    Deps.autorun(function (c) {
        console.log('run');
        var cursor = Answers.find({}, { sort: { time: 1 }});
        if (!cursor.count()) return;

        cursor.forEach(function (ans) {
            var user = Users.findOne({ "_id": ans.user }, { "fields": {"firstname": 1, "surname": 1} });
            ans.user = user;
            processed_data.push(ans);
        }); 

        console.log(processed_data);
        c.stop();
    }); 
}

数据将被反应,因为当您使用Deps.autorun时,function() {...}中的整个块将在每次响应变量或文档发生变化时以任何方式重新运行(更新后,移除或插入)或任何其他反应变量。

对于使用具有名字和姓氏的实际用户文档更新userId集合中的Answers的其他解决方案,您可以通过使用 {来实现此目的{3}} 进行更新。您可以通过 {{3上的 Bulk API operations rawCollection() 方法获取npm MongoDB驱动程序中的集合和数据库对象的原始访问权限}}

Answers = new Meteor.Collection("answers");
Users = new Meteor.Collection("users");

if (Meteor.isClient) {
    Template.answerlist.helpers({
        answers: function () {
            processed_data = []; 

            Deps.autorun(function (c) {
                console.log('run');
                var cursor = Answers.find({}, { sort: { time: 1 }});
                if (!cursor.count()) return;

                cursor.forEach(function (ans) {
                    var user = Users.findOne({ "_id": ans.user }, { "fields": {"firstname": 1, "surname": 1} });
                    ans.user = user;
                    processed_data.push(ans);
                }); 

                console.log(processed_data);
                c.stop();
            }); 

            return processed_data;
        }
    });

    Template.answerlist.events({
        'click #updateAnswers': function(ev) {
            Meteor.call('updateAnswersUser');
        }
    });

}


if (Meteor.isServer) {
    Meteor.startup(function () {
        Meteor.methods({
            updateAnswersUser: function() {
                var bulkOp = Answers.rawCollection().initializeUnorderedBulkOp(),
                    counter = 0;
                Answers.find({}).forEach(function(ans) {
                    var user = Users.findOne({ "_id": ans.user }, { "fields": {"firstname": 1, "surname": 1} });
                    var changes = {};
                    changes["user"] = user;
                    bulkOp.find({"_id": ans._id}).updateOne({ "$set": changes });

                    counter++;
                    if (counter % 1000 == 0) {
                        // Execute per 1000 operations and re-initialize every 1000 update statements
                        bulkOp.execute(function(e, r) {
                            console.info('r.nMatched', r.nMatched, 'r.nModified', r.nModified);
                        });
                        bulkOp = Answers.rawCollection().initializeUnorderedBulkOp();
                    }
                }); 

                // Clean up queues
                if (counter % 1000 != 0){
                    bulkOp.execute(function(e, r) {
                        console.info('r.nMatched', r.nMatched, 'r.nModified', r.nModified);
                    });
                }
            }
        }); 
    });
}

答案 1 :(得分:0)

您可以使用此查询从Users集合中获取名字和姓氏字段:

Users.find({_id: userId}, {fields:{Firstname: 1, surname: 1}}).fetch();

userId必须是Answers集合中用户ID的值。

我假设此值与Users集合中的_id相对应。

在每个答案中保存用户的名字和姓氏会导致不必要的数据重复。