查找包含子对象字段Mongoose

时间:2016-04-04 04:59:12

标签: node.js mongodb express mongoose

注意 :我问了这个问题here,但当时我纯粹是用MongoDB工作,现在我是试图用Mongoose实现这一点。我认为提出一个单独的问题是合适的,因为我相信答案会有根本的不同,但如果我在该决定中不正确,请告诉我。

我有一个具有以下格式的集合:

[ 
  {
     firstname: 'Joe',
     lastname: 'Blow',
     emails: [
       {
          email: 'test@example.com',
          valid: false
       },
       {
          email: 'test2@example.com',
          valid: false
       }
     ],
     password: 'abc123',
     _id: 57017e173915101e0ad5d94a
  },
  {
     firstname: 'Johnny',
     lastname: 'Doe',
     emails: [
       {
          email: 'test3@example.com',
          valid: false
       }
     ],
     password: 'abc123',
     _id: 57017e173915101e0ad5d87b
  },
]

我正在尝试根据emails.email字段找到用户。以下是我到目前为止的情况:

UserModel.find()
         .where('emails')
         .elemMatch(function (elem) {
           elem.where('email').equals(userEmail);
         })
         .limit(1)
         .exec(
         (err, usersReturned) => {
           console.log('test2@example.com');
         });

我做错了什么?我是Mongoose的新手,似乎无法解决这个问题。

2 个答案:

答案 0 :(得分:5)

你可以这样做:

UserModel.find({"emails.email": userEmail}).limit(1).exec(function(err, user){
    if(err) console.log("Error: " + JSON.stringify(err));
    else if(user) console.log("User Returned is : " + JSON.stringify(user));
});

答案 1 :(得分:0)

您可以在aggregate字段上使用Mongodb $unwind函数。使用"emails.email",它会将数组make作为独立文档分开。

UserModel.aggregate( [
    { $unwind : "$emails" },
    { $match: {$emails.email:"email you want to put"}}
],function(err,result){    
    //write code but you want to do
});