17

我有一个模型架构:

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。

4

4 回答 4

34

我也一直在寻找这个答案,但我不确定我是否喜欢访问数组的最后一个文档。但是,我确实有替代解决方案。该方法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 的特性。Mongoose create 记录在这里:create docs

因此,您还应该注意,即使您有一个子文档 _id - 在您保存它之前它还不存在于 Mongo 中,因此请注意您可能采取的任何 DOCRef 操作。

于 2014-06-02T20:54:28.330 回答
13

这个问题“有点”老了,但我在这种情况下所做的是在插入之前生成子文档的 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);
});

这样,即使保存和回调之间还有其他数据库操作,也不会影响已经创建的id。

于 2016-06-27T21:28:55.630 回答
7

Mongoose 会自动为每个新的子文档创建一个 _id,但是 - 据我所知 - 在您保存它时不会返回它。

所以你需要手动获取它。该save方法将返回保存的文档,包括子文档。当您使用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);
});
于 2013-09-12T09:49:26.430 回答
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(...
于 2017-01-11T06:23:16.303 回答