保存后访问子文档 ID - 猫鼬
Accessing a sub-document ID after save - mongoose
当我在我的应用程序上创建用户时,他们的详细信息会使用猫鼬保存在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
值的简单过程,因此不需要更复杂的方法。
相关文章:
- 猫鼬在特定记录中查找嵌套记录
- 猫鼬——如何找到物体所在的场&;name”;不包含数字
- 将图像文件存储在猫鼬模式中的二进制数据中,并以html形式显示图像
- 请求对象中的MEANJS猫鼬模型
- 哈希被推到猫鼬模型上作为'[对象对象]”;
- 猫鼬:$where不等
- 节点.js猫鼬性能
- 在 Node.js 中填充来自猫鼬的对象
- 没有字段名称的猫鼬结构聚合输出
- 使用猫鼬更新子文档
- 为什么我的猫鼬对象 Id 请求返回一个空数组
- 保存后访问子文档 ID - 猫鼬
- NodeJS - 猫鼬,subdoc 对象没有方法 .id() 或 .create()
- 猫鼬对 id 字段的请求返回 id 和_id
- 猫鼬对象 ID 不用作函数中的参数
- 猫鼬对象 ID 不作为函数中的参数工作
- 来自不同集合的子文档 ID 数组的猫鼬架构
- 自动增量不会在猫鼬中返回 ID
- 猫鼬多个同步查找重用对象ID
- 猫鼬.更新文档id抛出TypeError: Cannot read property '_id'未定义)