Justin
Justin

Reputation: 2049

Merging two Mongoose query results, without turning them into JSON

I have two Mongoose model schemas setup so that the child documents reference the parent documents, as opposed to the Parent documents having an array of Children documents. (Its like this due to the 16MB size limit restriction on documents, I didnt want to limit the amount of relationships between Parent/Child docs):

// 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'
    }
})

I want to create a static method that I can query for a Parent document, then query for any Child documents that match the parent document, then create a new item in the parent document that will reference the Children array.

Basically if the Parent document is:

{
    _id: ObjectId('56ba258a98f0767514d0ee0b'),
    name: 'Foo'
}

And the child documents are:

[
    {
        _id: ObjectId('56b9b6a86ea3a0d012bdd062'),
        name: 'Name A',
        _partition: ObjectId('56ba258a98f0767514d0ee0b')
    },{
        _id: ObjectId('56ba7e9820accb40239baedf'),
        name: 'Name B',
        _partition: ObjectId('56ba258a98f0767514d0ee0b')
    }
]

Then id be looking to have something like:

{
    _id: ObjectId('56ba258a98f0767514d0ee0b'),
    name: 'Foo',
    children: [
        {
            _id: ObjectId('56b9b6a86ea3a0d012bdd062'),
            name: 'Name A',
            _partition: ObjectId('56ba258a98f0767514d0ee0b')
        },{
            _id: ObjectId('56ba7e9820accb40239baedf'),
            name: 'Name B',
            _partition: ObjectId('56ba258a98f0767514d0ee0b')
        }
    ]
}

Also, I want them to remain Mongoose documents, so I can update the Parents and Assets if I need to.

I was able to accomplish this by using toJSON on the Parent, then creating a new item that would hold the Child docs, but then obviously the Parent document isn't a real document..

The error I kept getting when I tried this was that I couldnt create a new element in the Document that wasnt in the schema.

I know I could do something like create a Virtual item that would return the promise that would query the Children, but im looking to have one static method, that returns one response (meaning they dont have to handle the virtual item as a promise or callback)

Let me know if this is possible. Thanks!

Upvotes: 0

Views: 974

Answers (2)

jordiburgos
jordiburgos

Reputation: 6302

Use the .populate() method of the schema.

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

Upvotes: 0

Justin
Justin

Reputation: 2049

FYI, this apparently isn't possible, I've tried a few things and it doesn't seem like it will work.

Upvotes: 1

Related Questions