我有两个Mongoose模型架构设置,以便子文档引用父文档,而不是具有子文档数组的父文档。 (就像这样,由于对文档的16MB大小限制限制,我不想限制父/子文档之间的关系数量):
// Parent Model Schema
const parentSchema = new Schema({
name: Schema.Types.String
})
// Child Model Schema
const childSchema = new Schema({
name: Schema.Types.String,
_partition: {
type: Schema.Types.ObjectId,
ref: 'Parent'
}
})
我想创建一个静态方法,我可以查询父文档,然后查询与父文档匹配的任何子文档,然后在父文档中创建一个引用Children数组的新项。
基本上,如果父文件是:
{
_id: ObjectId('56ba258a98f0767514d0ee0b'),
name: 'Foo'
}
儿童文件是:
[
{
_id: ObjectId('56b9b6a86ea3a0d012bdd062'),
name: 'Name A',
_partition: ObjectId('56ba258a98f0767514d0ee0b')
},{
_id: ObjectId('56ba7e9820accb40239baedf'),
name: 'Name B',
_partition: ObjectId('56ba258a98f0767514d0ee0b')
}
]
然后我想找到类似的东西:
{
_id: ObjectId('56ba258a98f0767514d0ee0b'),
name: 'Foo',
children: [
{
_id: ObjectId('56b9b6a86ea3a0d012bdd062'),
name: 'Name A',
_partition: ObjectId('56ba258a98f0767514d0ee0b')
},{
_id: ObjectId('56ba7e9820accb40239baedf'),
name: 'Name B',
_partition: ObjectId('56ba258a98f0767514d0ee0b')
}
]
}
另外,我希望他们保留Mongoose文档,因此如果需要,我可以更新父母和资产。
我能够通过在Parent上使用toJSON
来完成此操作,然后创建一个包含Child文档的新项目,但显然父文档不是真正的文档..
我在尝试此操作时遇到的错误是我无法在架构中创建一个新元素。
我知道我可以做一些事情,比如创建一个虚拟项目,它会返回查询子项的承诺,但我希望有一个静态方法,它返回一个响应(意味着他们不必处理虚拟项目作为承诺或回电)
如果可能,请告诉我。谢谢!
答案 0 :(得分:0)
使用架构的.populate()方法。
Parent.find(query)
.populate("children")
.exec((err, items) => {
if (err) {
...
}
...
});