有没有办法在Mongoose的一个查询中从参数创建父级及其子级?

时间:2016-09-22 07:57:18

标签: mongodb mongoose foreign-keys mongoose-schema nosql

我们说我的Person(集合persons)定义如下:

const personSchema = Schema({
  name: String,
  children: [{
    type: Schema.Types.ObjectId,
    ref: 'Person',
  }],
})
const Person = mongoose.model('Person', personSchema)

我无法将children直接存储在Person内,因为两个对象可以链接到同一个child,这就是为什么我这样做的原因关系。

问题是,我想说我想在一个查询中创建Person及其children。我有一个args对象来获取数据,定义如下:

const args = { name: 'John', children: [{ name: 'Anna' }, {name: 'Craig'}] }

我需要一个查询来在persons集合中创建3个文档,名称为JohnAnnaCraig,并且还应记录AnnaCraig id John children字段内的{_id: 1, name: "John", children: [2, 3]} {_id: 2, name: "Anna"} {_id: 3, name: "Craig"} args字段,如下:

Person.create(args)

我尝试将此children传递给create函数:

ObjectId

它抱怨children数组不是type s的数组。

如果我用personSchema替换Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); Response.TransmitFile(Server.MapPath("/Uploads/" + fileName)); Response.End(); Content-Disposition,我猜(我还没有测试过),它会创建一个嵌套文档,我不想要。

所以,问题是:Mongoose有没有办法在一个查询中做我想做的事情? (我也知道我可以做多个查询来保存每个孩子,然后保存父母,但有些东西告诉我不应该这样做,应该有一个更容易的方法来做到这一点。)

1 个答案:

答案 0 :(得分:2)

尝试以下方法插入此类文档:

使用集合插入查询插入对象数组: 的例如:

PersonModel.collection.insert({ name: 'John', children: [{ name: 'Anna' }, {name: 'Craig'}] }, function() {
    console.log("insert person data");
});

文件:

{
    "_id" : ObjectId("57e8da5e6be4d87da7824d29"),
    "name" : "John",
    "children" : [ 
        {
            "name" : "Anna"
        }, 
        {
            "name" : "Craig"
        }
    ]
}

如果你想对每个子对象都有_id,那么你必须使用objectId构造函数手动生成objectId:

var mongoose = require(' mongoose');

PersonModel.collection.insert({
    name: 'John',
    children: [{
        _id: mongoose.Types.ObjectId(),
        name: 'Anna'
    }, {
        _id: mongoose.Types.ObjectId(),
        name: 'Craig'
    }]
}, function() {
    console.log("insert person data");
});

输出:

{
    "_id" : ObjectId("57e8dcd76e620c680d850ebe"),
    "name" : "John",
    "children" : [ 
        {
            "_id" : ObjectId("57e8dcd56e620c680d850eba"),
            "name" : "Anna"
        }, 
        {
            "_id" : ObjectId("57e8dcd56e620c680d850ebb"),
            "name" : "Craig"
        }
    ]
}

更新:

var mongoose = require('mongoose');

PersonModel.collection.insert([{
    name: 'Anna'
}, {
    name: 'Craig'
}], {
    ordered: true
}, function(err, data) {
    //console.log(data);
    var parent = {
        name: 'john',
        children: data.insertedIds
    };
    new PersonModel(parent).save()

});