我们说我的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个文档,名称为John
,Anna
和Craig
,并且还应记录Anna
和Craig
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有没有办法在一个查询中做我想做的事情? (我也知道我可以做多个查询来保存每个孩子,然后保存父母,但有些东西告诉我不应该这样做,应该有一个更容易的方法来做到这一点。)
答案 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()
});