鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ mongoose 條件查詢(xún)?

mongoose 條件查詢(xún)?

問(wèn)題描述

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

相關(guān)代碼

schema

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

數(shù)據(jù)

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

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

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

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

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

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

怎么才能得到想要的結(jié)果啊,請(qǐng)各位指點(diǎn)指點(diǎn),謝謝!

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

這樣應(yīng)該會(huì)得到

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

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

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