我对猫鼬来说相当新,所以我可能在这里错过了一些东西。
我有两个收藏品“公司”& “用户”我试图让所有属于公司的用户,但公司的用户数组返回undefined而不是我期望的用户对象。
我已阅读文档并且填充似乎是朝着正确方向迈出的一步但是,它没有提到任何阶段(我可以看到)如何保存到数组中我假设我需要推送对象到用户对象上的emails属性?
我来自一个非常沉重的mysql背景,如果有人能解释MongoDB如何处理关系,我可能会错误地做些事情。
公司架构
const companySchema = new Schema({
name: String,
slug: String,
_creator: { type: Schema.Types.ObjectId, ref: 'User' },
users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
created_at: Date,
updated_at: Date
});
module.exports = mongoose.model('Company', companySchema);
用户架构
const userSchema = new Schema({
first_name: String,
last_name: String,
username: String,
password: String,
companies: [{ type: Schema.Types.ObjectId, ref: 'Company' }],
created_at: Date,
updated_at: Date
});
module.exports = mongoose.model('User', userSchema);
保存用户
const dave = new User({
first_name: 'Dave',
last_name: 'Hewitt',
username: 'moshie',
password: '123456789',
updated_at: new Date()
});
dave.save()
.then(function (user) {
const indigoTree = new Company({
name: 'IndigoTree',
slug: 'indigotree',
_creator: dave._id,
updated_at: new Date()
});
indigoTree.users.push(user);
return indigoTree.save();
})
.then(function (company) {
console.log(company);
})
.catch(function (error) {
console.log(error);
});
检查用户
Company.find({}).populate('users').exec()
.then(function (doc) {
doc.users // undefined?
});
有什么想法吗?
答案 0 :(得分:0)
根据API Docs,Mongoose的find()
返回数组而不是单个项。
对于findOne(),它是一个潜在的null单文档,find()文档列表,count()文档数,update()受影响的文档数等等
Company.find({}).populate('users').exec().then((doc) => {
console.log(doc[0].users); // prints users array
});
答案 1 :(得分:0)
您正在将user
推入users
阵列。相反,您需要push
user's Id
进入数组,即user._id
。
<强>替换强>
indigoTree.users.push(user);
。通过强>
indigoTree.users.push(user._id);
此外,find()
查询返回array of documents
,因此您需要使用doc[0].users
,而不是doc.users
。
Company.find({}).populate('users').exec()
.then(function (doc) {
doc[0].users // undefined? -> change here, it wont come undefined
});
另外,您可以使用findOne()
代替find()
,而object
会返回doc.users
。在这种情况下,您可以使用 Company.findOne({_id: someCompanyId}).populate('users').exec()
.then(function (doc) {
doc.users // it wont come undefined
});
try {
pm = (KodoPersistenceManager)
((KodoPersistenceManagerFactory) kpmf).getPersistenceManager(false,
KodoPersistenceManager.CONN_RETAIN_PM);
Connection c = ((Connection)pm.getConnection());
c.setTransactionIsolation(
ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);
// ... use pm with retained connection ...
} finally { // reset retained connection, e.g. if pooled
if (pm != null) {
Connection c = ((Connection)pm.getConnection());
c.setTransactionIsolation(
ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);
}
}