2016-04-18 51 views
1

在我的應用上創建用戶時,他們的詳細信息將使用貓鼬保存在MongoDB中。 user schema包含子文件,我試圖訪問_id如果子文件使用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); 
       } 
      }); 

如何我可以訪問save函數內部的子文檔的_id創建並保存到MongoDB的右後用戶?

+1

在你的schema' phone'不是子文檔,所以它沒有'_id'。 – alexmac

+0

@AlexanderMac我認爲這個問題沒有正確顯示架構。這可能確實是電話:[{landline:Number,mobile:Number}]',但很高興得到確認。當然,對於「第一個」元素,它將是'user.phone [0] ._ id',但如果這是一個數組元素的「初始」保存或添加另一個元素,則在上下文中不會清除 –

+0

@NeilLunn對不起關於你正確的模式。我將更新我的問題 – Skywalker

回答

0

有兩種方法來獲取這些信息,但我個人更喜歡使用$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價值的臨時副本的小動作意味着「最新」項目總是在最後。而且你只需要在更新中添加儘可能多的內容。

這裏的爭論點在於它實際上是mongoose,它首先插入了_id值。所以實際上這些都是在對每個數組項目的服務器請求中提交的。

您「可能」變得很花哨,並使用「掛鉤」來記錄在更新語句中實際添加到新陣列成員的那些ObjectId值。但它實際上只是一個簡單的過程,無論如何都返回數組項中最後的「最大」_id值,因此不需要更復雜的方法。

+0

這非常有幫助。謝謝!!! – Skywalker