Node.js MongoDB更新子文档不会影响原始文档,反之亦然
我正在使用mongoose,并具有以下模式:Node.js MongoDB更新子文档不会影响原始文档,反之亦然,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在使用mongoose,并具有以下模式: var mongoose = require('mongoose'); mongoose.connect(/*...*/) const usersSchema = new Schema({ email: String, name: String }) const ordersSchema = new Schema({ user: usersSchema, // <--- ref to usersSchema
var mongoose = require('mongoose');
mongoose.connect(/*...*/)
const usersSchema = new Schema({
email: String,
name: String
})
const ordersSchema = new Schema({
user: usersSchema, // <--- ref to usersSchema
createdOn: Date,
// ...
})
const UsersModel = mongoose.model('Users', usersSchema );
const OrdersModel = mongoose.model('Orders', ordersSchema );
现在我修改用户文档:
// update original user:
var userDocToModify = await UsersModel.findById(savedUser._id);
userDocToModify.email = "BBB@example.com";
await userDocToModify.save();
断言将在以下行失败:
var orderDoc = await OrdersModel.findById(savedOrder._id);
assert(orderDoc.user.email == userDocToModify.email, 'email not changed in the orderDoc.user.email!');
实际上,您在这里所做的不是引用userSchema。您正在将该模式嵌入orders模式。如果要引用用户,应执行以下操作:
const ordersSchema = new Schema({
user: {type: mongoose.Schema.Types.ObjectId, ref: 'Users'}
createdOn: Date,
// ...
})
在这种情况下,您只需将用户id存储在父文档中。
现在,如果您想获取订单和其中的用户,您可以在mongoose中使用mongoose或$lookup
const ordersSchema = new Schema({
user: {type: mongoose.Schema.Types.ObjectId, ref: 'Users'}
createdOn: Date,
// ...
})