在我的应用程序上创建用户时,他们的详细信息将使用mongoose保存在MongoDB上。 public async Task v_task()
{
await Task.Run(() => Console.WriteLine("Hello!"));
}
public async void v1()
{
await v_task();
// some other actions...
}
public void ButtonClick()
{
v1();
Console.WriteLine("Hi!");
}
包含子文档,如果使用user schema
函数后的子文档,我试图访问_id
。
架构如下:
user.save
我可以像这样轻松访问姓名,电子邮件和地址:
{
name: String,
email: String,
address: String,
phone:[
{landLine: Number,
mobile: Number}
]
}
我尝试console.log(user.name + user.email + user.address)
,但它返回user.phone._id
。我认为因为undefined
是一个对象数组。
phone
如何在创建用户并将其保存到mongoDB后立即访问 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);
}
});
函数内的子文档的_id?
答案 0 :(得分:1)
获取此信息有两种方法,但我个人更喜欢" atomic"使用$push
修改方法。
这里的实际实现有助于mongoose自动包含ObjectId
值,这是" monotonic"因此价值总是在增加。这意味着我处理此方法的方法甚至适用于$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
值。实际上,这些是在为服务器发出的每个数组项的请求中提交的。
你"可以"得到花哨和使用"钩子"记录在update语句中实际添加到新数组成员的ObjectId
个值。但它真的只是一个回归过去n
"最伟大"无论如何,数组项中的_id
值,因此不需要更复杂的方法。