MongoDB中的子模式(Subschema)通常指的是嵌套文档的结构。ObjectId是MongoDB中用于唯一标识文档的12字节BSON类型数据。ObjectId数组则是指在一个文档中包含多个ObjectId的数组字段。
类型:
应用场景:
假设我们有一个用户集合和一个订单集合,用户文档中有一个字段orderIds
存储该用户的所有订单的ObjectId。
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "John Doe",
"orderIds": [
ObjectId("507f1f77bcf86cd799439012"),
ObjectId("507f1f77bcf86cd799439013")
]
}
{
"_id": ObjectId("507f1f77bcf86cd799439012"),
"product": "Laptop",
"quantity": 1
}
const mongoose = require('mongoose');
const { Schema, model } = mongoose;
// 定义订单Schema
const orderSchema = new Schema({
product: String,
quantity: Number
});
const Order = model('Order', orderSchema);
// 定义用户Schema
const userSchema = new Schema({
name: String,
orderIds: [{ type: Schema.Types.ObjectId, ref: 'Order' }]
});
const User = model('User', userSchema);
// 创建订单并填充到用户文档中
async function createUserWithOrders() {
await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
const order1 = new Order({ product: 'Laptop', quantity: 1 });
const order2 = new Order({ product: 'Phone', quantity: 2 });
await order1.save();
await order2.save();
const user = new User({
name: 'John Doe',
orderIds: [order1._id, order2._id]
});
await user.save();
console.log('User created with orderIds:', user.orderIds);
await mongoose.disconnect();
}
createUserWithOrders().catch(console.error);
问题:在填充ObjectId数组时,可能会遇到ObjectId未正确生成或关联的问题。
原因:
解决方法:
// 确保订单文档保存成功后再创建用户文档
async function createUserWithOrders() {
await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
try {
const order1 = new Order({ product: 'Laptop', quantity: 1 });
const order2 = new Order({ product: 'Phone', quantity: 2 });
const savedOrder1 = await order1.save();
const savedOrder2 = await order2.save();
const user = new User({
name: 'John Doe',
orderIds: [savedOrder1._id, savedOrder2._id]
});
await user.save();
console.log('User created with orderIds:', user.orderIds);
} catch (error) {
console.error('Error creating user with orders:', error);
} finally {
await mongoose.disconnect();
}
}
createUserWithOrders();
通过以上步骤,可以有效解决填充ObjectId数组时可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云