合并两个Mongoose查询结果,而不将它们转换为JSON

时间:2016-02-11 08:45:48

标签: mongodb mongoose mongodb-query mongoose-populate mongoose-schema

我有两个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文档的新项目,但显然父文档不是真正的文档..

我在尝试此操作时遇到的错误是我无法在架构中创建一个新元素。

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

如果可能,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

使用架构的.populate()方法。

Parent.find(query)
    .populate("children")
    .exec((err, items) => {
        if (err) {
            ...
        }
        ...
    });