保存后访问子文档 ID - 猫鼬

Accessing a sub-document ID after save - mongoose

本文关键字:ID 猫鼬 文档 访问 保存      更新时间:2023-09-26

当我在我的应用程序上创建用户时,他们的详细信息会使用猫鼬保存在MongoDB上。user schema包含子文档,如果在使用user.save功能后访问子文档,我正在尝试访问_id

架构如下:

{
  name: String,
  email: String,
  address: String,
  phone:[
     {landLine: Number,
      mobile: Number}
   ]
}

我可以轻松访问姓名,电子邮件和地址,如下所示:

console.log(user.name + user.email + user.address)

我试过user.phone._id但它返回undefined.我认为是因为phone是一个对象数组。

 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 后立即访问save函数中子文档的_id?

几种方法可以获取此信息,但我个人更喜欢使用 $push 的"原子"修改方法。

猫鼬在这里的实际实现是由猫鼬自动包括一个"单调"的ObjectId值,因此总是在增加值。所以这意味着我处理这个问题的方法甚至可以与应用于$push$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);
  }
)  

_id值上"排序"临时副本的小技巧意味着"最新"项目始终位于末尾。而且您只需要删除您在更新中添加的尽可能多的内容即可。

这里值得争论的一点是,实际上首先插入_id值的是mongoose。因此,实际上这些是在针对每个数组项向服务器发出的请求中提交的。

你"可以"花哨地使用"钩子"在更新语句中记录那些实际添加到新数组成员的ObjectId值。但这实际上只是从数组项返回最后n"最大"_id值的简单过程,因此不需要更复杂的方法。