0

我有两个 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'
    }
})

我想创建一个静态方法,我可以查询父文档,然后查询与父文档匹配的任何子文档,然后在父文档中创建一个将引用子数组的新项目。

基本上,如果父文档是:

{
    _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 文档,以便在需要时更新父母和资产。

我能够通过toJSON在 Parent 上使用来完成此操作,然后创建一个包含 Child 文档的新项目,但显然 Parent 文档不是真正的文档..

当我尝试这样做时,我一直遇到的错误是我无法在文档中创建一个不在架构中的新元素。

我知道我可以做一些事情,比如创建一个虚拟项目,它会返回查询孩子的承诺,但我希望有一个静态方法,返回一个响应(这意味着他们不必将虚拟项目作为承诺或回调处理)

让我知道这是否可能。谢谢!

4

2 回答 2

1

仅供参考,这显然是不可能的,我已经尝试了一些东西,但它似乎不起作用。

于 2016-02-21T16:43:24.670 回答
0

使用模式的 .populate() 方法。

Parent.find(query)
    .populate("children")
    .exec((err, items) => {
        if (err) {
            ...
        }
        ...
    });
于 2017-07-22T19:32:56.223 回答