鍍金池/ 問答/數(shù)據(jù)庫  HTML/ mongoose 條件查詢?

mongoose 條件查詢?

問題描述

想要得到course字段中復合要求的一條數(shù)據(jù),使用find后返回的數(shù)據(jù)包含多余數(shù)據(jù),結果不理想。想要達到目的應該如何編寫代碼,初學moongse,似乎需要用到populate或者aggregate,這應該怎么寫合適呢?謝謝!

相關代碼

schema

const courseInf = new Schema({
    teacher:String,
    courseName:String,
});
const student = new Schema({
    name:String,                //姓名
    classname:String,                //班級
    stunum:String,                //學號
    oldpassword:String,           //舊密碼
    newpassword:String,           //新密碼
    phonenum:String,              //手機號
    course:[courseInf]           //課程
});

數(shù)據(jù)

{ _id: 5b7a97508e00501ceaf66030,
  name: '張三',
  class: '1',
  stunum: '111',
  oldpassword: '111',
  course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等數(shù)學'
      },
     { _id: 5b7a97508e00501ceaf66031,
       teacher: '趙六',
       courseName: '線性代數(shù)'
        } ],
  __v: 0 }

你期待的結果是什么?實際看到的錯誤信息又是什么?

想要只返回這一條數(shù)據(jù)

 course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等數(shù)學'
      }]

原來我的寫法是 student.find({stunum:'1',courseName:'高等數(shù)學',teacher:'李四'});
但是返回的結果是

course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等數(shù)學'
      },
     { _id: 5b7a97508e00501ceaf66031,
       teacher: '趙六',
       courseName: '線性代數(shù)'
        } ]}

怎么才能得到想要的結果啊,請各位指點指點,謝謝!

回答
編輯回答
安于心
student.aggregate([
    {
        $match:{stunum:'1'}
    },{
        $unwind:{
            path:'$course',
            preserveNullAndEmptyArrays: true,
        }
    },{
        $match:{courseName:'高等數(shù)學',teacher:'李四'}
    },{
        $project:{
            course:1
        }
    }
])

這樣應該會得到

course:{ 
    _id: 5b7a97508e00501ceaf66032,
    teacher: '李四',
    courseName: '高等數(shù)學'
}

如果只是想修改值,那就不需要取出來,直接修改就可以了

student.update(
    {stunum:'1'},
    {
        $set:{'course.$[element].teacher':'張三'}
    },
    {arrayFilters:[{'element.teacher':'李四'}]}
)
2018年9月3日 12:24