首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个'ref‘字段创建mongoose.js对象。(或:如何切换到nosql,事件驱动的思维方式)

使用多个'ref‘字段创建mongoose.js对象。(或:如何切换到nosql,事件驱动的思维方式)
EN

Stack Overflow用户
提问于 2014-05-13 07:17:08
回答 1查看 769关注 0票数 0

首先,我是几年来使用Django和关系数据库的,但是我想尝试一些新的东西--所以这可能是我的一个概念性问题。我只是不知道它在哪。希望这个问题足够清楚,尽管我不确定我该问什么.

所以。我正在设置一个包含团队的应用程序,以及这些团队之间的匹配。

以下是我的模特:

代码语言:javascript
复制
var TeamSchema = new Schema({
  name: String,
  code: String
});

TeamSchema.statics = {
  list: function(options, cb) {
    var criteria = options.criteria || {};
    this.find(criteria)
      .exec(cb);
  },
  load: function(id, cb) {
    this.findOne({_id: id})
      .exec(cb);
  },
};

var MatchSchema = new Schema({
  home_team: { type: Schema.ObjectId, ref: 'Team' },
  away_team: { type: Schema.ObjectId, ref: 'Team' },
  datetime: Date,
  slug: String,
  home_score: Number,
  away_score: Number
});

当我想以编程方式填充这些模型时,就会遇到问题。球队很容易做到:

代码语言:javascript
复制
// Clear old teams, then add default teams
Team.find({}).remove(function() {
  Team.create({
    name: 'Brazil',
    code: 'bra'
  }, {
    name: 'Cameroon',
    code: 'cmr'
  }, {
    name: 'Spain',
    code: 'esp'
  }, {
....

但是我想要创建匹配,这需要获得团队的_ids。按照我的想法,这非常容易:创建团队,然后在创建匹配之前,获取适当的团队并分配给变量,最后使用这些变量创建匹配以填充home_teamaway_team字段。

当然,这在这里不起作用,因为不能保证在调用Match creating函数时已经填充了团队。所以我将代码移到团队创建代码的回调中。但是,这仍然不起作用,因为当创建匹配时,团队变量仍未填充。我把匹配创建代码作为对团队查找的回调(这本身就是对团队创建代码的回调)来实现这一点。但是,这只适用于其中一个团队,在创建匹配之前,如何确保两个_ids都可用?

正如我在一开始所说的那样,我觉得我想错了--所以我不一定在寻找工作代码,更多的是关于我的想法哪里出错的提示。

尽管如此,这是我为其中一个团队设置的工作代码:

代码语言:javascript
复制
// Clear old teams, then add default teams
Team.find({}).remove(function() {
  Team.create({
    name: 'Brazil',
    code: 'bra'
  }, {
    name: 'Croatia',
    code: 'hrv'
  }, 
  function() {
    console.log('finished populating teams');
    // Clear old matches, then add default matches
    Match.find({}).remove(function() {
      Team.findOne({code: 'bra'}, function(err, obj) {
        if (!err) {
          console.log(obj.code);
          Match.create({
            datetime: "2014-06-01T22:00:00.000Z",
            slug: 'bra-hrv',
            home_team: obj._id
         });
       } else {
         console.log(err);
       }
     });
    });
  });
});

编辑:找到一个绕过它的方法。由于code对每个团队都是唯一的,所以我将team _id字段切换为String并删除了code。这样,我就可以轻松地创建Match对象,而无需查找_id --我已经知道它是什么了。

并不能真正解决我的根本问题,但它确实能完成工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 12:49:56

如果使用newsave创建Team文档,则可以立即访问它们的_id值,因为它们被分配给客户端:

代码语言:javascript
复制
var brazil = new Team({
    name: 'Brazil',
    code: 'bra'
  });
brazil.save();
var croatia = new Team({
    name: 'Croatia',
    code: 'hrv'
  });
croatia.save();

Match.create({
  datetime: "2014-06-01T22:00:00.000Z",
  slug: 'bra-hrv',
  home_team: brazil._id,
  away_team: croatia._id
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23624944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档