我有一个模型架构:
var A = new Schema ({
a: String,
b : [ { ba: Integer, bb: String } ]
}, { collection: 'a' } );
然后
var M = mongoose.model("a", A);
var saveid = null;
var m = new M({a:"Hello"});
m.save(function(err,model){
saveid = model.id;
}); // say m get the id as "1"
然后
m['b'].push({ba:235,bb:"World"});
m.save(function(err,model){
console.log(model.id); //this will print 1, that is the id of the main Document only.
//here i want to find the id of the subdocument i have just created by push
});
所以我的问题是如何找到刚推到模型的一个字段中的子文档的id。
答案 0 :(得分:28)
我一直在寻找这个答案,我不确定我是否喜欢访问该阵列的最后一个文档。不过,我确实有另一种解决方案。方法m['b'].push
将返回一个整数,1或0 - 我假设这是基于推送的成功(在验证方面)。但是,为了访问子文档,特别是子文档的_id,您应首先使用create
方法,然后使用push
。
代码如下:
var subdoc = m['b'].create({ ba: 234, bb: "World" });
m['b'].push(subdoc);
console.log(subdoc._id);
m.save(function(err, model) { console.log(arguments); });
当你将对象传递给push或create方法时,会立即进行Schema强制转换(包括验证和类型转换等) - 这意味着这是创建ObjectId的时间;不是当模型保存回Mongo时。实际上,mongo不会自动将_id值分配给子文档,这是一个猫鼬功能。此处记录了Mongoose创建:create docs
因此,您还应注意,即使您有一个子文档_id - 在您保存它之前它还没有在Mongo中,所以要对您可能采取的任何DOCRef操作感到厌倦。
答案 1 :(得分:7)
Mongoose会自动为每个新子文档创建一个_id,但据我所知 - 保存时不会返回此内容。
所以你需要手动获取它。 save
方法将返回已保存的文档,包括subdocs。当您使用push
时,您知道它将是数组中的最后一项,因此您可以从那里访问它。
这样的事情应该可以解决问题。
m['b'].push({ba:235,bb:"World"});
m.save(function(err,model){
// model.b is the array of sub documents
console.log(model.b[model.b.length-1].id);
});
答案 2 :(得分:4)
问题是“有点”陈旧,但我在这种情况下做的是在插入之前生成子文档的id。
var subDocument = {
_id: mongoose.Types.ObjectId(),
ba:235,
bb:"World"
};
m['b'].push(subDocument);
m.save(function(err,model){
// I already know the id!
console.log(subDocument._id);
});
这样,即使save和回调之间还有其他数据库操作,它也不会影响已经创建的id。
答案 3 :(得分:0)
如果您的子文档有一个单独的模式,那么您可以在将模型推送到父文档之前从模型创建新的子文档,它将具有ID:
var bSchema = new mongoose.Schema({
ba: Integer,
bb: String
};
var a = new mongoose.Schema({
a: String,
b : [ bSchema ]
});
var bModel = mongoose.model('b', bSchema);
var subdoc = new bModel({
ba: 5,
bb: "hello"
});
console.log(subdoc._id); // Voila!
稍后您可以将其添加到您的父文档中:
m['b'].push(subdoc)
m.save(...