0

私はかなり単純なコレクションを持っています:

var Access = new Schema({
  userId         : { type: ObjectId, index: true },
  token          : { type: String, index: true },
  isOwner        : { type: Boolean, index: true },
});
mongoose.model('Access', Access);

var Workspace = new Schema({
  name           : { type: String, lowercase: true, unique: true},
  description    : String,
  isActive       : Boolean,
  settings       : {
    longName        : String,
    welcomeMessage  : String,
    countryId       : { type: ObjectId, index: true },
  },
  access          : [ Access ],
});
mongoose.model('Workspace', Workspace);

ユーザーが接続すると、ミドルウェアがトークンをチェックして、すべてが正常かどうかを確認します。ので、私は持っています:

exports.tokenCall = function( req, res, next, token ){

  var Workspace = mongoose.model('Workspace'),
      User = mongoose.model('User'),
      accessEntry;

  req.application = {};

  // Find the token
  Workspace.findOne({ 'access.token': token } , function(err, doc){
    if(err){
      next( new g.errors.RuntimeError503( err ) );
    } else {
      if(! doc ){
        next( new g.errors.BadtokenError403() );
      } else {
        accessEntry = doc.access.filter(function(entry){ return entry.token == token;  } )[0];

        req.application.workspaceId = doc._id;
        req.application.workspaceName = doc.name;
        req.application.userId = accessEntry.userId;
        req.application.login =  accessEntry.login;
        req.application.token = token;
        req.application.workspace = doc; // Contains all of the settings!
        next();
      }
    }
  });
}

ここで私の問題を確認できると確信してWorkspace.findOne({ 'access.token': token } , function(err, doc){います。正しいトークンを使用してドキュメントを見つけるために実行します。しかし、その後、私は実際に...配列(!)を検索して、探した実際のトークンを見つけています!accessEntry = doc.access.filter(function(entry){ return entry.token == token; } )[0];私はこれがこれを行う方法ではないと確信しています-確かに。4レベル下のクエリを実行するとどうなりますか...?!?

それで、これを行う正しい方法は何ですか?

4

1 に答える 1

1

Mongo 2.2を使用している場合は、新しい$elemMatch射影演算子を利用accessして、返されたドキュメントに一致する配列要素のみを含めることができます。

Workspace.findOne(
    { 'access.token': token }, 
    { _id: 1, name: 1, access: { $elemMatch: { token: token } } },
    function(err, doc) {
        // doc contains _id, name, and only the access array elements that match on token
于 2012-08-31T04:10:54.347 に答える