4

サブドキュメント「連絡先」を含むマングースでユーザースキーマを設定しました。サブドキュメント「連絡先」は、実際の連絡先 (別のユーザー オブジェクトへの参照) と「友情」に関連するいくつかのデータを含む連絡先オブジェクトのコレクションです。

私のフロントエンド アプリケーションでは、連絡先リストにユーザーを追加または削除することで、連絡先を管理できるようになりました。フロントエンドは、これらの変更を HTTP PUT リクエストとしてサーバーに保存します。

PUT 要求には、データベース上のユーザー オブジェクトを多かれ少なかれ置き換えるユーザー オブジェクト全体が含まれます。残念ながら、サブドキュメント コレクションを置き換えることはできません。新しいものをプッシュするか、削除することしかできません。

スキーマは次のとおりです。

var UserSchema = new Mongoose.Schema({

    username: { 
        type: String, 
        index: { unique: true, sparse: true }, 
        required: true, lowercase: true, trim: true
    },

    email: {
        type: String,
        index: { unique: true, sparse: true }, 
        required: true, lowercase: true, trim: true
    },

    contacts: [ContactSchema]

});

var ContactSchema = new Mongoose.Schema({

    user: {
        ref: "User",
        type: Mongoose.Schema.ObjectId
    },

    isContact: {
        type: Boolean,
        default: true
    }

});

現在、連絡先をすべて削除してリクエストに追加することで、連絡先を置き換えようとしています。

app.put('/me', loadUser, function(req, res, next) {
    var user = req.user;

    req.user.contacts.forEach(function(contact) {
        req.body.contacts.forEach(function(contact) {
            contact.remove();
        });
    });

    req.body.contacts.forEach(function(contact) {
        req.user.contacts.push(contact);
    });

    user.save(function(err, user) {
        if (err) return next(err);
        res.send(200);
    });
});

このサブドキュメント コレクションをリクエストの状態に更新する方法について、実際に誰かがより良い考えを持っていますか?

4

2 に答える 2

6

_underscore ライブラリを使用して、削除するオブジェクトをフィルター処理 (拒否) できます

これは、foreach を使用せずに配列から何かを削除する方法の例です。

var _und = require('underscore');

var array = [{_id:1, title:'object one'}, {_id:2, title:'object two'}, {_id:3, title: 'object three' }]
    the_target = 'object two';
    new_array = _und.reject(array, function(item){
       return item.title === target;
    })

期待される結果は次のとおりです。

=> [{_id:1, title:'object one'}, {_id:3, title:'object three'}]

IDがわかれば尚更です。

あとは、次のようにしてサブドキュメントを空にするだけです。

var mytargetarray = [];
    mytargetarray.push(new_array);
    mytargetarray.save();

subdoc 配列全体を置き換えたい場合は、それらを置き換えるだけではどうですか:

req.user.contacts = [];
req.user.contacts.push(req.body.contacts);

保存して完了。

それが少し役立つことを願っています。

ヒントとして、mongodb ではオブジェクト配列を操作します。すべての値を簡単に置き換えることができます。

// active data from database
user.name = 'test user';
// now just give the object a new value
user.name = 'new name';
// and save .. done
user.save();
于 2012-11-23T16:37:46.093 に答える