0

mongoose find メソッドを使用して、不明なオブジェクト上のオブジェクトを見つけようとしています。よりよく説明するコードを次に示します。

ここに私のモデルがあります:

var Screen = new mongoose.Schema({
    id : Number,
    pid : Number,
    uploaded : {type: Date, default: Date.now },
    name : String,
    url : String,
    shorty : String
});

var User = new mongoose.Schema({
  id : Number,
  mail:    { type : String, match : /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/ },
  pass:  String,
  token:  String,
  inscDate: { type: Date, default: Date.now },
  lastConnec:     { type: Date, default: Date.now },
  screens:   [Screen],
  lastIp : String,
  valid : { type: Boolean, default : 0}
});

var UserModel = mongoose.model('users', User);
var ScreenModel = mongoose.model('screens', Screen);

つまり、私のユーザー モデルには画面の配列が含まれているということです。基本的には不明なユーザーの正確な画面を検索したい。このようなことをする:

var query = UserModel.find({'screens.shorty' : shorty});
query.exec(function(err, screenR) {

    });

しかし、このコードはクラッシュし、私が試した他の同様のコードでは、空の配列以外は何も返されませんでした。そして、私の検索は間違っていません (正確な文字列をコピーしようとしました)。

それを行う方法はありますか?

4

2 に答える 2

2

MongoDB 2.2以降を使用している場合は、$射影演算子を使用してscreens、クエリセレクターに一致する最初の要素にフィルターをかけることができます。

このような:

var query = UserModel.findOne({'screens.shorty': shorty}, {'screens.$': 1});
query.exec(function(err, user) {
    if (user) {
        // user.screens[0] contains the first element with the matching shorty field
    }
});
于 2012-11-23T04:18:59.093 に答える
0

さて、私はこの仕事をすることができました。これが最もエレガントな方法かどうかはわかりませんが、少なくとも次の方法です。

var query = UserModel.find({'screens.shorty' : shorty}); // That query will get me the correct user, but not the screen
query.exec(function(err, screenR) {
    if (err) throw err;
    if (screenR[0]){ 
        for (var i in screenR[0].screens){ // I loop through all the screens
            if (screenR[0].screens[i].shorty == shorty) {
                // Here I have the correct screen and can do whatever with it.
            }

        }

    } else {
        // If no result
    }
});
于 2012-11-22T20:46:14.367 に答える