gpt4 book ai didi

javascript - 当我尝试引用另一个模式的对象时,为什么 mongoose ref 对我不起作用?

转载 作者:行者123 更新时间:2023-12-02 17:13:55 26 4
gpt4 key购买 nike

我正在尝试访问商店地址的属性,但我不断收到“未定义”消息。事实证明,该地址只是一个 ID,即使我在该地址的架构中声明了“ref”。我在这里做错了什么?

initStores 的输出

{ name: 'Wegmans',
address: 53b998d9fcf740e07a4d03f7,
_id: 53b998d9fcf740e07a4d03f8,
items: [] }
53b998d9fcf740e07a4d03f7
undefined

路由器/index.js

router.post('/initStores', function(req, res) {
var address = new Address({
street: '650 Hylan Dr',
city: 'Rochester',
state: 'NY',
zipcode: '14623',
telephone: '123-456-7890'
});
// address.save();

var store = new Store({
name: 'Wegmans',
address: address
});

console.log( store );
console.log( store.address );
console.log( store.address.street );
// store.save();
}

模型/address.js

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var AddressSchema = new Schema({
type: { type: String, default: 'Store' }, // Store, apartment, house, headquarter
street: { type: String, require: true },
city: { type: String, require: true },
state: { type: String, require: true },
zipcode: { type: String, require: true },
country: { type: String, default: 'United States' },
telephone: { type: String, default: '555-555-5555' }
});

mongoose.model('Address', AddressSchema);

模型/store.js

var mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var StoreSchema = new Schema({
name: { type: String, require: true },
address: { type: ObjectId, ref: 'Address' },
items: [ { type: ObjectId, ref: 'Item' } ]
});

mongoose.model( 'Store', StoreSchema );

最佳答案

对于引用的模式,此代码完全按照设计工作。 “地址”架构中的字段根本不是“商店”架构的一部分。引用设计在这里所做的只是存储相关文档的 _id 值,该文档的其余部分将驻留在它自己的集合中。

因此,实际上您实际上是单独创建这些文件,并且只有在 .populate() 操作之后,不同的文档实际上“看起来”是“连接”的,就像它们出现在如果文档实际上是“嵌入的”,则采用 native 方式。

Store.findById(store._id).populate("address").exec(err,newstore) {

console.log(newstore);
});

或者因为您确实已经拥有“存储”对象并确保“保存”已完成:

async.series(
[
function(callback) {
address.save(function(err,address) {
callback();
});
},
function(callback) {
store.save(function(err,store) {
Store.populate(store,{ path: "address"},function(err,store) {
console.log(store);
callback();
});
});
}
]
);

在没有需要保存数据的 .populate() 的情况下,它可以并且“应该”显示为整个对象的唯一方法是嵌入地址,使其成为一部分“商店”的,并且不保存到不同的模型和集合:

var StoreSchema = new Schema({
name: { type: String, require: true },
address: {
"type": { type: String, default: 'Store' }, // Store, apartment, house, headquarter
street: { type: String, require: true },
city: { type: String, require: true },
state: { type: String, require: true },
zipcode: { type: String, require: true },
country: { type: String, default: 'United States' },
telephone: { type: String, default: '555-555-5555' }
},
items: [ { type: ObjectId, ref: 'Item' } ]
});

或者,如果您的目的只是纯粹登录创建,那么您可以使用 .toObject() 进行转换和操作:

var raw = store.toObject();
raw.address = address.toObject();

console.log( raw );

但对于引用模型来说,其目的是在调用 .populate() 之前数据不是同一对象的一部分。

关于javascript - 当我尝试引用另一个模式的对象时,为什么 mongoose ref 对我不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24599243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com