创建查询(加入)或更正设计?

时间:2012-03-02 09:05:03

标签: javascript node.js mongodb

我在使用此设计构建一些简单查询时遇到问题。问题很简单我希望获得包含用户信息的帖子,这些信息应该都在一个数组中,所以我可以将它传递给快速视图。

简单而且对我来说,似乎错误的解决方案是在找到所有posts(db.post.find({email:'mo@gmail.com'})之后然后循环遍历帖子并使用户集合查找查询然后合并结果。

其他解决方案是使用链接作者的DBref这可能会更好,但我还没有找到如何进行查询。

// User, the profile is not complete there will be more fields
var u = {
    name: 'Michael', // Is not unique
    email: 'mo@gmail.com', // Should be also unique
    fbid: '4545454asdadsa'
}

db.user.insert(u);

// User can have 0 to many posts

var p = {
    title: 'Suprise',
    body: 'Well done',
    tags: ['first', 'post', 'english'],
    author: 'mo@gmail.com',
    created: new Date(),
    modified: new Date()
};
db.post.insert(p);

var p = {
    title: 'Weather in Estonia',
    body: 'Always looks bad',
    tags: ['bad', 'weather', 'estonia'],
    author: 'mo@gmail.com',
    created: new Date(),
    modified: new Date()
}
db.post.insert(p);

1 个答案:

答案 0 :(得分:2)

var p = {
    title: 'Suprise',
    body: 'Well done',
    tags: ['first', 'post', 'english'],
    author: {
        name: 'Michael', // Is not unique
        email: 'mo@gmail.com', // Should be also unique
        fbid: '4545454asdadsa'
    },
    created: new Date(),
    modified: new Date()
};

您嵌入了文档,您进行了非规范化。这是它的工作原理。现在你可以获得所有帖子,而不必查询用户,因为他们已经在那里。

数据结构

我将说明如何做到这一点。我完全偏离了非规范化。这意味着你永远不需要加入。请注意,如果它只是残留而且从不需要,可以删除其中的一部分。

帖子收藏

{
  title: String,
  body: String,
  tags: [String],
  author: {
    name: String,
    email: String,
    fbid: String
  },
  created: Date,
  modified: Date,
  comments: [{
    body: String,
    created: Date,
    modified: Date
  }]
}

用户集合

{ 
  name: String,
  email: String,
  fbid: String,
  posts: [{
    title: String,
    body: String,
    tags: [String],
    created: Date,
    modified: Date,
    comments: [{
      body: String,
      created: Date,
      modified: Date
    }]
  }]
}

评论集

{
  body: String,
  created: Date,
  modified: Date,
  author: {
    name: String,
    email: String,
    fbid: String
  },
  post: {
    title: String,
    body: String,
    tags: [String],
    created: Date,
    modified: Date
    comments: [{
      body: String,
      created: Date,
      modified: Date
    }]
  }
}