Javascript 保存后访问子文档ID-mongoose

Javascript 保存后访问子文档ID-mongoose,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,在我的应用程序上创建用户时,他们的详细信息将使用mongoose保存在MongoDB上。user schema包含子文档,我正在尝试在使用user.save功能后访问子文档的\u id 模式如下: { name: String, email: String, address: String, phone:[ {landLine: Number, mobile: Number} ] } 我可以轻松访问姓名、电子邮件和地址,如下所示: console.l

在我的应用程序上创建用户时,他们的详细信息将使用mongoose保存在MongoDB上。
user schema
包含子文档,我正在尝试在使用
user.save
功能后访问子文档的
\u id

模式如下:

{
  name: String,
  email: String,
  address: String,
  phone:[
     {landLine: Number,
      mobile: Number}
   ]
}
我可以轻松访问姓名、电子邮件和地址,如下所示:

console.log(user.name + user.email + user.address)
我尝试了
user.phone.\u id
,但它返回
undefined
。我想是因为电话是一个对象数组

 user.save(function(err) {
                if (err)
                    throw err;
                else {
                    console.log("user ID " + user._id); // SUCCESS!!
                    console.log("user sub-document ID " + user.phone._id); // UNDEFINED!!
                    return (null, user);
                }
            });

在创建用户并将其保存到mongoDB之后,如何在
保存
功能中访问子文档的_id?

有几种方法可以获取此信息,但我个人更喜欢使用“原子”修改方法

这里的实际实现是由mongoose自动提供帮助的,它包括一个
ObjectId
值,该值是“单调的”,因此值总是在增加。因此,这意味着我处理此问题的方法甚至可以与应用于的
$sort
修饰符一起工作

例如:

// Array of objects to add
var newNumbers = [
  { "landline": 55555555, "mobile": 999999999 },
  { "landline": 44455555, "mobile": 888888888 }
];

User.findOneAndUpdate(
  { "email": email },
  { "$push": { "phone": { "$each": newNumbers } } },
  { "new": true },
  function(err,user) {
    // The trick is to sort() on `_id` and just get the
    // last added equal to the length of the input
    var lastIds = user.phone.concat().sort(function(a,b) {
      return a._id > b._id
    }).slice(-newnumbers.length);
  }
)  
即使使用了
$sort
修饰符:

User.findOneAndUpdate(
  { "email": email },
  { "$push": { "phone": { "$each": newNumbers, "$sort": { "landline": 1 }  } } },
  { "new": true },
  function(err,user) {
    var lastIds = user.phone.concat().sort(function(a,b) {
      return a._id > b._id
    }).slice(-newnumbers.length);
  }
)  
\u id
值上对临时副本进行“排序”的小技巧意味着“最新”项始终位于末尾。你只需要去掉你在更新中添加的尽可能多的结尾

这里有争议的一点是,实际上是
mongoose
首先插入了
\u id
值。因此,事实上,这些都是在为每个数组项向服务器发出的请求中提交的


您“可以”使用“hooks”记录那些实际添加到update语句中新数组成员的
ObjectId
值。但是它实际上只是从数组项返回最后一个
n
“最大的”
\u id
值的简单过程,因此不需要更复杂的方法。

在您的模式中
手机
不是子文档,因此它没有
\u id
@AlexanderMac我认为问题是没有正确显示模式。它可能真的是
电话:[{landline:Number,mobile:Number}]
,但如果能得到确认就好了。当然,“first”元素是
user.phone[0]。\u id
,但在上下文中也不清楚这是一个数组元素的“初始”保存还是添加另一个数组元素的“初始”保存one@NeilLunn是的,很抱歉你说的是对的。我将更新我的问题。看起来您仍然没有正确地表示模式。这正是我所要了解的,因此我在您的问题中寻找一些上下文。实际上,您是如何向阵列添加其他项的?更重要的是,在实际应用添加到数组之前,数据实际上是如何传入的?这为不同的方法提供了一些背景。