Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么在mongoose中使用ObjectId集合而不是对象?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 为什么在mongoose中使用ObjectId集合而不是对象?

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

我只是在学习NoSQL,特别是MongoDB,更具体地说是节点下的mongoose;但这是一个有点不可知论的设计问题

我在各种教程中看到的是一种数据设计,它在子对象和父对象之间具有双向链接,父对象将子对象的集合存储为ObjectId数组。然后,Mongoose可以使用populate拉入实际的子对象。例如:

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当然是正确的,但是使用引用单独收集的主要好处是您可以独立查询它们。所以这都是关于权衡的。