Javascript 保存后访问子文档ID-mongoose
在我的应用程序上创建用户时,他们的详细信息将使用mongoose保存在MongoDB上。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
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是的,很抱歉你说的是对的。我将更新我的问题。看起来您仍然没有正确地表示模式。这正是我所要了解的,因此我在您的问题中寻找一些上下文。实际上,您是如何向阵列添加其他项的?更重要的是,在实际应用添加到数组之前,数据实际上是如何传入的?这为不同的方法提供了一些背景。