有没有一种方法可以从 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 个文档,名称为 John
、Anna
和 Craig
,它还应该记录 Anna
和 Craig
的 id
s 在 John
的 children
字段中,像这样:
{_id: 1, name: "John", children: [2, 3]}
{_id: 2, name: "Anna"}
{_id: 3, name: "Craig"}
我试图将此 args
传递给这样的创建函数:
Person.create(args)
并且它抱怨 children
数组不是 ObjectId
数组。
我猜(还没有测试)如果我用 personSchema
替换 children
的 type
,它会创建一个嵌套文档,我不想。
所以,问题是: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()
});
假设我有一个这样定义的 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 个文档,名称为 John
、Anna
和 Craig
,它还应该记录 Anna
和 Craig
的 id
s 在 John
的 children
字段中,像这样:
{_id: 1, name: "John", children: [2, 3]}
{_id: 2, name: "Anna"}
{_id: 3, name: "Craig"}
我试图将此 args
传递给这样的创建函数:
Person.create(args)
并且它抱怨 children
数组不是 ObjectId
数组。
我猜(还没有测试)如果我用 personSchema
替换 children
的 type
,它会创建一个嵌套文档,我不想。
所以,问题是: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()
});