2016-12-23 7 views
1

私は1つのメインコレクションと1つのコレクションを持っています。コードは次のようになります。モンゴース人口が空のオブジェクトを返す

// Ref schema 
    const onlineSchema = mongoose.Schema({ 
     _id: { 
      type: Number, 
      ref: 'Player', 
      unique: true 
     } 
    }, { 
     timestamps: true 
    }); 

//main schema 

const playerSchema = mongoose.Schema({ 

_id: { // User ID 
    type: Number, 
    required: true, 
    unique: true, 
    default: 0 
}, 
firstname: { 
    type: String 
}, 
name: { 
    type: String, 
    required: true 
}, 
lastname: { 
    type: String 
}, 
barfoo: { 
    type: Boolean 
} 
... 

}) 

私はこのコードを移入:

var baz = bar; 
... 
     Online.find().populate({ 
      path: '_id', 
      match: { 
       [ baz + 'foo']: true 
      } 
     }).exec(function(err, online) { 
      if (err) { 
       winston.error(err); 
      } else { 
       winston.error(util.inspect(online, { 
        showHidden: false, 
        depth: null 
       })); 

      } 
     }); 

オンラインで10個の要素とはわずか7試合[ baz + 'foo']: trueがある場合は、私は7つの適切な配列とこのようになり3空の配列を取得します:

{ updatedAt: 2016-12-23T18:00:32.725Z, 
createdAt: 2016-12-23T18:00:32.725Z, 
_id: null, 
__v: 0 }, 

なぜこのようなことが起こり、最終結果をフィルタリングして一致する要素のみを表示するのですか?

私は結果を得た後にnull配列を削除するためにfilterを使うことができますが、最初にヌル配列を渡すことを避ける方法を知りたいと思います。

答えて

1

なぜこの出来事はありますか?

あなたはOnline.find()ですべての文書を取得するが、playerだけで、あなたの条件に一致するレコードのために移入されますので、これが起こっています。 matchpopulateであり、find()クエリではありません。それが唯一の一致 の要素を示して

は、どのように私は最終的な結果をフィルタリングするのですか?

MongoDBには結合がないため、参照されたコレクションのネストされた要素を見つけることはできません。しかし、あなたがすることができます:

  • あなたのスキーマを保持し、$lookupで集約を使用します。

    Online.aggregate(
        [{ 
         $lookup: { 
          from: "players", 
          localField: "_id", 
          foreignField: "_id", 
          as: "players" 
         } 
        }, { 
         $unwind: "$players" 
        }, { 
         $match: { 
          'players.barfoo': true 
         } 
        }], 
        function(err, result) { 
         console.log(result); 
        }); 
    
  • サブ文書としてPlayerを含めるようにスキーマを変更

    const playerSchema = new mongoose.Schema({ 
        //... 
    }); 
    
    const onlineSchema = new mongoose.Schema({ 
        player: playerSchema 
    }, { 
        timestamps: true 
    }); 
    
    var Online = mongoose.model('Online', onlineSchema); 
    
    Online.find({'player.barfoo':true}).exec(function(err, online) { 
        console.log(online); 
    }); 
    
0

いけない代わりに、別のfieldplayerを作り、それを通じてreferenceを与え、別のスキーマの_idreferenceを作ります。

const onlineSchema = mongoose.Schema({ 
    player: { 
     type: Number, 
     ref: 'Player', 
     unique: true 
    } 
}, { 
    timestamps: true 
}); 

人口:

Online.find().populate({ 
    path: 'player', 
    match: { 
     [ baz + 'foo']: true 
    } 
}).exec(...); 
+0

参照として_idを使用するまで、Populateは正しく動作しませんでした。 – Trax

0

使用いけません_idフィールドを参照する.. mongoDBでインデックスが一意に作成されるためにデフォルトが設定されているため.. changあなたはフィールド名です

関連する問題