在Mongoose中填充ObjectId的数组

Nic*_*ons 7 mongoose

我的文档包含一个叫做的字段clients,它应该包含一个客户端ID数组.

{
  "first_name":"Nick",
  "last_name":"Parsons",
  "email":"nick@movementstrategy.com",
  "password":"foo",
  "clients":[
    "50f5e901545cf990c500000f",
    "50f5e90b545cf990c5000010"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的数据以JSON形式出现,我直接将其发送给Mongo以创建文档.由于某种原因,clients我在创建时没有填充,所以我必须手动输入它们作为字符串.

我的架构非常简单,定义如下:

var userSchema = new Schema({
    first_name: {
        type: String,
        trim: true
    },
    last_name: {
        type: String,
        trim: true
    },  
    email: {
        type: String,
        trim: true,
        lowercase: true,
        index: true,
        unique: true,
        required: true
    },
    password: String,
    clients: [Schema.Types.ObjectId]
});
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我已正确定义了客户.但是当我进行创建时,我无法填充客户端数组.事件传递给mongo的原始对象看起来很好.

{ 
    first_name: 'Zack',
    last_name: 'S',
    email: 'zack@movementstrategy.com',
    password: 'test',
    clients: [
       '50f5e901545cf990c500000f', 
       '50f5e90b545cf990c5000010' 
    ] 
}
Run Code Online (Sandbox Code Playgroud)

有什么特别的东西我必须做我的输入,以便它正确的铸造?

Nic*_*ons 10

简单的修复.检查是否已填充传入阵列.如果是这样,我遍历每个并将转换后的ObjectId版本推送到数组中.显然mongoose.Types.ObjectId('STRING');能够将一般字符串转换为有效的mongoose id.

// if clients was passed with associated client ids
if (data.clients.length > 0) {

    _.map(data.clients, function(cid) {

        // push client id (converted from string to mongo object id) into clients
        user.clients.push(mongoose.Types.ObjectId(cid));

    });

}
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.


Mic*_*nos 1

接受的答案可能已经过时了......

如果您要更新此集合,我建议使用 $push 更新。这种更新方法旨在避免在您所做的只是追加到集合中的数组时执行更新。

http://docs.mongodb.org/manual/reference/operator/update/push/