スキーマを更新して新しいプロパティフィールドを追加しようとしています。更新されたフィールドにアクセスできるようにして、スキーマにプロパティを追加するのと同じくらい簡単になることを望んでいました。
既存のスキーマがあります
let userDrinkSchema = new mongoose.Schema({ new Schema
creator : {
type: mongoose.Schema.Types.ObjectId,
ref: 'user' // name of user file
},
caffeine: Number,
mgFloz: Number,
name: String,
size: Number,
updated_at: {
type: Date,
default: Date.now()
}
});
このスキーマからIDを追加する必要があります
const UserSchema = mongoose.Schema({
const User = module.exports = mongoose.model('User', UserSchema);
ユーザーごとにこのプロパティを追加する方法がわかりません。私はこの例に従いました Mongooseでのスキーマ変更の処理
スキーマは次のようになりました。
let DrinkSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'user',
required: true,
default: null
},
caffeine: Number,
mgFloz: Number,
name: String,
size: Number,
imageUrl: String,
date: {
type: Date,
default: Date.now()
}
},
{
collection: 'drinkList'
});
残念ながら、私にとってはユーザーもnullです
{
"_id":"58bba13bb7afeaa3180aa929",
"caffeine":422,"mgFloz":218.7,
"name":"10 Hour Energy Shot",
"size":1.93,
"url":"/caffeine-content/10-hour-eternal-shot",
"date":"2017-03-28T13:10:12.650Z",
"user":null
}
ユーザーフィールドを更新してユーザー情報を取得する方法はありますか?私が参照しているスキーマは次のように設定されています
const SelectedDrinks = require('./userDrinks').schema;
const UserSchema = mongoose.Schema({
name: {
type: String
},
email: {
type: String,
required: true
},
username: {
type: String,
required: true
},
password: {
type: String,
required: true
},
caffeine_list: [SelectedDrinks]
})
Mongodbは、作成時に各ユーザーにIDを追加することがわかります。これは私がアクセスしようとしているものです。
私のバックエンドルートはExpressで構成されています。私はユーザーIDを持っているので、郵便配達員と一緒にこれを機能させることができます。このルート内で正しいユーザーIDを取得する方法がわかりません。
router.post('/addDrink', (req, res, next) => {
let newDrink = new UserDrinks({
creator: req.body.creator, // need id get user object id()
caffeine: req.body.caffeine,
mgFloz: req.body.mgFloz,
name: req.body.name,
size: req.body.size,
updated_at: req.body.updated_at
});
newDrink.save( (err) => {
if(err) {
res.send(err);
} else {
User.findOne({ _id: newDrink.creator}, (err, user) => {
user.caffeine_list.addToSet(newDrink)
user.save( function (err) {
if(err) {
console.log(err);
}else {
res.status(201).json(newDrink);
}
})
})
}
})
});
私がこの権利を理解している場合、あなたはcreator
フィールドをuser
フィールドに置き換えようとしています。これを達成するには、2つのことを行う必要があります。
/addDrink
ルートを変更しますdrinkList
コレクション内の既存のドキュメントを更新します1)newDrink
を作成するときは、user
:の代わりにcreator
を設定してください
let newDrink = new UserDrinks({
user: req.body.creator,
caffeine: req.body.caffeine,
mgFloz: req.body.mgFloz,
name: req.body.name,
size: req.body.size,
updated_at: req.body.updated_at
});
2)すべてのUserDrinks
を更新して、フィールドの名前を変更します:
UserDrinks.update({}, { $rename: { "creator" : "user" } }, { multi: true }, callback)
これにより、すべてのUserDrinksドキュメントが検索され、creator
プロパティの名前がuser
に変更されます。
1回限りの変更のために新しいルートを作成せずにこれを行う簡単な方法は、エクスプレスセットアップで一時関数を作成し、ローカルで実行し、後でコードを削除/コメントして、再度実行されないようにすることです。 。例:
function renameCreatorField() {
UserDrinks.update({}, { $rename: { "creator" : "user" } }, { multi: true }, function(err, data) {
if (!err) {
//success
}
})
}
renameCreatorField();
これは、サーバーが起動するとすぐに実行されます。 (1)で行った変更により、今後のUserDrinksドキュメントに正しいフィールドが設定されるようになるため、一度実行すると削除できます。
もちろん、簡単な修正を探しているだけで、これがライブアプリケーションではない場合は、(1)を実行し、データベースをクリアして、正しいドキュメントからやり直すことができます。しかし、それは学ぶ方法ではありません。 :)