2017-01-09 133 views
0

我有我的jqgrid中的學生列表。如果我想學生名單分配給員工,然後我就檢查我想同學,然後我分配給員工,使得員工記錄類似於下面如何在Mongoose中插入objectId到數組中?

我的員工記錄:

{ 
     "_id": "ObjectId("58622e3bf39d570b21ece1b3")", 
     "name" : "Alex", 
     "__v" : 6.0, 
     "students" : [ 
      "586f8f0cd26a47718b9db4d6", 
      "586f8ef5d26a47718b9db4d4", 
      "586538693b5b5d5d8bc46b1f" 
     ] 
    } 

我的學生場模型:

students: { 
    type: Array, 
    default: '' 
    }, 

我的後端代碼:

exports.update = function (req, res) { 
    var body = req.body; 
    employee = _.extend(employee, req.body); 
    employee.save(function (err) {}) 
}; 

在這裏,我確定了到這一點,但我沒能在這裏做兩件事情

  1. 我希望存儲學生ID作爲

    ,但它被存儲爲

    58622e3bf39d570b21ece1b3 
    
  2. 當我分配學生時,不應插入重複記錄,即不應再插入已存在的學生。

回答

1

有兩個問題和幾個問題。

  1. 您的students數組。

您應該指定數組中的項目類型,然後mongoose會將這些項目轉換爲ObjectID,即使它們是從前端來的字符串。所以,你應該模式看起來更像是這樣的:

students: [ { type: mongoose.Schema.Types.ObjectId }] 
  • 確保獨特
  • 的MongoDB可以確保uniquess只有翻過整個集合,而不是一個單一的陣列。但是你可以使用$ addToSet來做到這一點 - >然後mongoDB會確保跳過模糊。

    編輯:根據評論請求,顯示子陣列唯一性的一個例子。

    正如我所說的,你不能讓MongoDB在單個文檔中的項目放置索引。你必須在應用程序中這樣做。但正如我也說過的,你可以直接使用$ addToSet。例如。

    employees.update({ 
        _id: req.params.id 
        }, 
        { 
        $addToSet: { 
         students: { 
         $each: req.body.studetns 
         } 
        } 
        }).exec().then(response => res.json(response)).catch(next); // or whatever. 
    
    +0

    謝謝Zlatko,我清除了我的第一個問題,但我必須看到我的第二個問題的解決方案。 – MMR

    +0

    請問您可以用您的$ addToSet更改我的代碼..... – MMR

    +0

    哦,這有點複雜,但請嘗試。 – Zlatko