有没有一种方法可以从 Mongoose 中的一个查询中的参数创建 parent 及其 child?

Is there a way to create a parent and its child from arguments in one query in Mongoose?

假设我有一个这样定义的 Person(集合 persons):

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

我不能将children直接存储在一个Person里面,因为两个object可以link到同一个child,所以这就是为什么我是通过关系来做的。

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

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

我需要一个查询在 persons 集合中创建 3 个文档,名称为 JohnAnnaCraig,它还应该记录 AnnaCraigids 在 Johnchildren 字段中,像这样:

{_id: 1, name: "John", children: [2, 3]}
{_id: 2, name: "Anna"}
{_id: 3, name: "Craig"}

我试图将此 args 传递给这样的创建函数:

Person.create(args)

并且它抱怨 children 数组不是 ObjectId 数组。

我猜(还没有测试)如果我用 personSchema 替换 childrentype,它会创建一个嵌套文档,我不想。

所以,问题是:Mongoose 中有没有一种方法可以在一个查询中执行我想要的操作? (我也知道我可以做多个查询来保存每个 child,然后保存 parent,但有些事情告诉我这不是应该做的,应该有更简单的方法来做到这一点).

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

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

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()

});