保存后访问子文档ID - mongoose

时间:2016-04-18 10:09:26

标签: javascript node.js mongodb mongoose mongodb-query

在我的应用程序上创建用户时,他们的详细信息将使用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?

1 个答案:

答案 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值,因此不需要更复杂的方法。