2017-10-28 67 views
0

我正在嘗試爲mongodb對象使用自定義_id。在mongodb中使用自定義_id,並鏈接到另一個對象

我有兩個對象:用戶&集團

用戶:

const mongoose = require('mongoose'); 
const { Schema } = mongoose; 

const ObjectId = Schema.Types.ObjectId; 

const userSchema = new Schema(
    { 
     //Username 
     _id: { 
      type: String, 
      unique: true 
     }, 

     name: { 
      type: String, 
      required: 'Name is required.' 
     }, 

     //Groups [ group-unique-url ] 
     Groups: { 
      type: [ObjectId], 
      default: [] 
     } 
    }, 
    { _id: false } 
); 

mongoose.model('users', userSchema); 

組:

const mongoose = require('mongoose'); 
const { Schema } = mongoose; 

const groupSchema = new Schema(
    { 
     //unique URL 
     _id: { 
      type: String, 
      unique: true 
     }, 

     //Name of the Group 
     name: { 
      type: String, 
      unique: true, 
      required: true 
     } 
    }, 
    { _id: false } 
); 

mongoose.model('groups', groupSchema); 

保存用戶:

const user = new User({ 
    name: 'Surya Chandra', 
    _id: 'surya' 
}); 
user.save(); 

省電組:

const group = new Group({ 
    name: 'StackOverflow', 
    _id: 'stack.com' //unique 
}); 
group.save(); 

直到這裏一切工作正常。現在我必須將該組鏈接到用戶。

用戶id => '蘇里亞' &的groupId => 'stack.com'

const user = await User.findById(userId); //'surya' 

if (user.Groups.indexOf(groupId) >= 0) { 
} else { 
    user.Groups.push(groupId); //user.G.push(mongoose.Types.ObjectId(_g)); 
    user.save(); 
} 

user.Groups.push(的groupId)

CastError: Cast to ObjectId failed for value "stack.com" at path "Groups" 

user.Groups.push(mongoose.Types .ObjectId(_g));我不確定如何將用戶組添加到組。如何查詢特定組中的所有用戶?另外,這是否支持從用戶組字段填充組名?

謝謝。

+1

This'in User'is wrong:'Groups:{type:[ObjectId],default:[]}'。您似乎嘗試一個「引用」模式。您在'Group'內定義了'_id'作爲「string」,因此您的「reference」列表需要是「相同類型」,並且表示爲「ref」,Groups:[{type:ObjectId,ref: '組'}]'。這實際上全部在[Mongoose Schemas](http://mongoosejs.com/docs/guide.html)中詳述。另外'default:[]'不起作用。在模式中定義數組元素時,如果您不提供元素,則會得到一個空數組。 –

回答

1

在你userSchema,你應該做這樣的替代

const userSchema = new Schema(
{ 
    //Username 
    _id: { 
     type: String, 
     unique: true 
    }, 

    name: { 
     type: String, 
     required: 'Name is required.' 
    }, 

    groups: [{ type: Schema.Types.ObjectId, ref: 'groups'}] 
}, 
); 

裁判:「羣體」必須

mongoose.model('groups', groupSchema); 

的找到你在你的團隊模型中定義的模型名稱相匹配之後,您可以使用填充('組')。閱讀貓鼬的文檔更詳細 我也不明白你爲什麼要重寫_id貓鼬。我不認爲它會起作用。如果您想讓某個字段具有唯一性,您可以嘗試其他名稱。

+0

如何推送用戶模型的新組內字段?同時保存... user.Groups.push(groupId); //或user.G.push(mongoose.Types.ObjectId(_g)); user.save(); –

+0

我想我明白了... 組:[{類型:Schema.Types.ObjectId,REF: '羣體'}] 應該 組:[{類型: '字符串',裁判: '羣體' }] ...作爲組ID是String而不是ObjectId –

+0

我認爲你應該保持類型:Schema.Types.ObjectId。要推新羣組,你可以做一些像User.findByIdAndUpdate(yourUserId,{$ push:{groups:yourNewGroup}})。它也可以工作 – dnp1204

相關問題