gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:17 25 4
gpt4 key购买 nike

当在我的应用程序上创建用户时,他们的详细信息将使用 mongoose 保存在 MongoDB 上。 用户架构包含子文档,我尝试在使用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,但它返回未定义。我认为是因为 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 的“原子”修改方法。 .

这里的实际实现是通过 Mongoose 自动包含一个“单调”的“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 值“排序”临时副本的小技巧意味着“最新”项目始终位于末尾。您只需从末尾删除与更新中添加的数量一样多的内容。

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

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

关于javascript - 保存后访问子文档 ID - mongoose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36690982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com