2016-06-12 15 views
0

私は何をしたいのか分からない。私のスキーマは次のようなものです:mongooseに対して値の配列を検索する

var userObj = mongoose.Schema({ 
    'timestamp':{type: Date, default: Date.now()}, 
    'password':{type:String, required:true}, 
    "userName":{type:String, required:true, unique:true} 
}); 

    var groupSchema = mongoose.Schema({ 
    'creator':String, 
    'members':Array, //contains the _id of users added to the group 
    'admins':Array, 
    'name':String, 
    'timestamp':{type: Date, default: Date.now()}, 
    'description':String 
    }); 

ここで、メンバースキーマはユーザーのIDを含む配列を持っています。グループ文書から配列を取り出し、ユーザー名を取得する必要があります。

私はmongoose .find()メソッドを使用してループを開始し、結果を配列にプッシュしましたが、配列がコールバック関数の範囲外で空であると予想しました。

 var dat = []; 
    for(var i = 0; i<passed.payload.length;i++){ 
     user.find({'_id':passed.payload[i]},'userName',function(err,result){ 
     if(err){ 
      console.log(err); 
     }else{ 
      dat.push(result); 
     } 
     }) 

    } 
    //res.send(dat) 

    console.log(dat); 

私はこれを行う方法を確認していない - 私は、唯一の一致したバックを返すための配列を実行しているすべてのユーザーIDを引っ張って.find使用して考えました。これは、フルユーザーテーブルを取得してからテストするためのリソースの浪費のようです。

mongooseで照合する_idsの配列を使用してこのようなデータを取得するために使用できるより複雑なクエリがありますか?

答えて

0

$inオペレーターを使用したことはありませんか?

db.users.find({ userName: { $in: ["Paul", "Jenna" ] } })

これは、より効率的であると同様にループを削除しなければなりません。ここ

MongoDBのドキュメント https://docs.mongodb.com/manual/reference/operator/query/in/#op._S_in

+0

はい、そうでした。私は学ぶことを学ぶこと以外はほとんど気が気にならない、それは学ぶのは良いことだった、私はそれを見たが、その使い方を誤解した。ありがとう! – grishrl

0

forループ外に空の配列を取得している理由へのリンクがマングースのクエリは(あなたのケースUser.find()に)非同期であり、マングースのクエリがある前に、したがって、ループのために完成する予定であります完了したら空の配列になります。約束を使うか、またはasyncのようなnpmモジュールを使ってこれを扱うことができます。

しかし、@ karlkurzerはここで配列をループする必要はないと示唆したので、代わりに$inoperatorを使用することができます。上記のコードは、

user.find({'_id': {$in: passed.payload}},'userName',function(err,results){ 
    if(err){ 
     console.log(err); 
    }else{ 
     console.log(results); //You will get array of user names here 
    } 
    }); 

と置き換えることができ、コールバックで渡されたIDに関連付けられたuserNamesの配列を取得する必要があります。

希望すると便利です。

関連する問題