如何在Mongoose中将objectId插入数组?

时间:2017-01-09 11:05:53

标签: node.js mongodb mongoose

我的jqgrid中有一个学生列表。如果我想将一个学生列表分配给一个员工,那么我只是检查我想要的学生,然后我分配给一个员工,使员工记录如下所示

我的员工记录:

 {
      "_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存储为

    ObjectId("58622e3bf39d570b21ece1b3")
    

    但它存储为

    58622e3bf39d570b21ece1b3
    
  2. 当我指派学生时,不应插入重复的记录,即不应再插入学生已存在。

1 个答案:

答案 0 :(得分:1)

有两个问题和几个问题。

  1. 您的students数组。
  2. 您应该指定数组中的项目类型,然后mongoose会将这些项目转换为ObjectID,即使它们来自前端的字符串。所以你的架构看起来应该更像这样:

    students: [ { type: mongoose.Schema.Types.ObjectId }]
    
    1. 确保独特性
    2. MongoDB可以确保只在整个集合中进行,而不是单个数组。但你可以通过使用$ addToSet - >来做到这一点。然后mongoDB将确保跳过欺骗。

      编辑:根据评论请求,显示子阵列唯一性的示例。

      正如我所说,你不能让MongoDB在单个文档中放置一个索引。你必须在应用程序中这样做。但正如我所说,你可以直接使用$ addToSet。 E.g。

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