web-dev-qa-db-ja.com

マングースのスキーマを更新して、新しいプロパティを追加します

スキーマを更新して新しいプロパティフィールドを追加しようとしています。更新されたフィールドにアクセスできるようにして、スキーマにプロパティを追加するのと同じくらい簡単になることを望んでいました。

既存のスキーマがあります

  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);
                    }
                })
            })

        }

    })
});
7
Winnemucca

私がこの権利を理解している場合、あなたはcreatorフィールドをuserフィールドに置き換えようとしています。これを達成するには、2つのことを行う必要があります。

  1. /addDrinkルートを変更します
  2. 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)を実行し、データベースをクリアして、正しいドキュメントからやり直すことができます。しかし、それは学ぶ方法ではありません。 :)

6
Kevin McGovern