2012-11-22 28 views
0

我想使用猫鼬查找方法来找到未知对象上的对象。以下是更好解释的代码。使用查找模型内的模型

这里是我的模型:

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) { 

    }); 

但这个代码崩溃了,我从来没有尝试过其他类似的代码返回其他任何东西比一个空数组。我的搜索没有错(我试图复制一个确切的字符串)。

有没有办法做到这一点?

+0

如果你开始接受更多的答案,你会得到更多的帮助。你应该检查最适合你的答案。 – Rayshawn

+0

我接受该工作的答案。只是大多数情况下,我收到的答案不是解决方案,而是我单独发现的 - 但我可能会忘记一两个,我将检查 – Malharhak

回答

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 
    } 
}); 
+0

这似乎很棒。我会尝试根据这个修改我的代码。谢谢 :) – Malharhak

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 
    } 
}); 
+1

如果您只需要数据库中的一个文档,则使用findOne而不是find – norman784

+0

哦谢谢:)我不知道那 – Malharhak