Node.js 为什么在mongoose中使用ObjectId集合而不是对象?
我只是在学习NoSQL,特别是MongoDB,更具体地说是节点下的mongoose;但这是一个有点不可知论的设计问题 我在各种教程中看到的是一种数据设计,它在子对象和父对象之间具有双向链接,父对象将子对象的集合存储为ObjectId数组。然后,Mongoose可以使用populate拉入实际的子对象。例如:Node.js 为什么在mongoose中使用ObjectId集合而不是对象?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我只是在学习NoSQL,特别是MongoDB,更具体地说是节点下的mongoose;但这是一个有点不可知论的设计问题 我在各种教程中看到的是一种数据设计,它在子对象和父对象之间具有双向链接,父对象将子对象的集合存储为ObjectId数组。然后,Mongoose可以使用populate拉入实际的子对象。例如: var PostSchema = new mongoose.Schema({ title: String, comments: [{type: mongoose.Schema
var PostSchema = new mongoose.Schema({
title: String,
comments: [{type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}]
});
var CommentSchema = new mongoose.Schema({
comment: String,
post: {type: mongoose.Schema.Types.ObjectId, ref: 'Post'}
});
在我看来,这似乎造成了以下问题:
1现在插入新注释还需要对Post记录进行额外更新,以便将注释id添加到注释集合中。删除注释也是如此
2没有引用完整性,应用程序本身的负担是确保没有孤立的注释,也没有包含无效注释ID的帖子
3 populate方法是mongoose的一部分,而不是MongoDB,因此,如果我需要使用其他方法访问此数据,如何将子对象取出
我总是可能误解了NoSQL的好处,即您可以将整个对象图存储为一个实体。因此,如果不看这些教程,我会天真地将注释作为完整对象与文章一起存储,并使用投影来避免在不需要它们时加载它们。现在玩过了,我不明白你为什么不想那样做。我问我的同伴StukOfFuffias为启迪。 @ JunyHK可能被欺骗,而对那个帖子的回答确实有一些有用的信息,我不认为这是一个重复的问题。有一些有文档记录的教程展示了我在示例中使用的特定方法,我正试图理解其背后的原因。也许你可以把你的问题缩小一点。您列出的问题1和2当然是正确的,但是使用引用单独收集的主要好处是您可以独立查询它们。所以这都是关于权衡的。