保存文档及其对象ID以便在其他文档中引用

时间:2015-10-31 18:32:23

标签: javascript node.js mongodb mongoose nosql

Node.js应用中Mongodb / Mongoose。我有两个系列。 UsersBooks。我的问题是:当用户保存书籍时,我必须将其保存在Books集合中,并将其对象ID保存在Users集合中以供参考。一个用户输入的两个保存操作。

这是正确的方法吗?这是Mongodb标准吗?在基于关系的数据库系统中,它是一个错误的架构,但在Mongodb中缺少加入我该怎么办?如果我有一个大型数据库,我应该在每个相关集合中保存当前的书籍ID吗?

我知道我可以在每个用户文档中嵌入书籍,但它有自己的问题。

我很困惑。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用Mongoose在MongoDB中创建MySQL“join”。它不是MongoDB标准,但它使MongoDB中的开发有时更容易。下面是两个简单的示例模式。

var BookSchema = new Schema({
    title: {
        type String
    },
    author: {
        type: String
    }
});
module.exports = mongoose.model('Book', BookSchema);

var UserSchema = new Schema({
    username: {
        type: String,
        required: true
    },
    books: [{
        type: String,
        ref: 'Book'
    }]
});
module.exports = mongoose.model('User', UserSchema);

在最后一个模式中,有一个“books”属性,其中包含对书籍的引用。您可以在数组中存储对象ID的字符串(而不是对象)。如果需要,您还可以存储Object id而不是Strings。以下是用户的示例模式:

{
    username: "Fcoder",
    books: ["550adf3899fbe92a168d3051", "550adf3899fbe92a168d3052"]
}

查询MongoDB数据库时,您可以populate数据。您的查询将如下所示:

User.find({}).populate('books').exec(function(err, data) {
    // callback
});

在内部数据中,您会发现如下内容:

{
    username: "Fcoder",
    books: [{
        _id: ObjectId("550adf3899fbe92a168d3051"),
        title 'Some title 1',
        author: 'Some author 1'
    }, {
        _id: ObjectId("550adf3899fbe92a168d3052"),
        title 'Some title 2',
        author: 'Some author 2'
    }
}