搜索mongoose

时间:2016-06-12 21:11:08

标签: node.js express 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);

我不知道该怎么做 - 我考虑使用.find拉取所有用户ID然后运行数组只返回匹配。这似乎是浪费资源来拉动完整的用户表然后测试它。

是否有一个更复杂的查询我可以使用mongoose来使用_ids数组来匹配这样的数据?

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用$in运营商?

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

这应该更有效并且也会删除循环。

这里是MongoDB文档的链接 https://docs.mongodb.com/manual/reference/operator/query/in/#op._S_in

答案 1 :(得分:0)

你在for循环外得到一个空数组的原因是mongoose查询是异步的(在你的情况下是User.find())因此for循环将在mongoose查询完成之前完成,从而产生你得到的空数组。您可以使用promises或某些npm模块(如async

)来处理此问题

但是,由于@karlkurzer建议您不需要在此处循环播放数组,因此您可以使用$in operator。上面的代码可以替换为,

  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数组。

希望这有帮助!