我需要根据名字和电话号码获取该用户的身份证号码

查询条件是 "attendees.iphone"="1518971234","attendees.name"="徐一"。期望返回的结果如下所示:

"_id" : ObjectId ( "6093aa6650b8140013983781" ), "attendees" : [ "key" : "1" , "name" : "徐一" , "role" : "applicant" , "idcard" : "320481199405131234" , "iphone" : "1518971234" ,

但是find 的结果,事与愿违,把数组里的全部元素返回给了我

$elemMatch (projection)

e l e m M a t c h 操作符将查询结果中字段的内容限制为只包含与 elemMatch操作符将查询结果中字段的内容限制为只包含与 elemMatch条件匹配的第一个元素。

官方Api地址: docs.mongodb.com/manual/refe…

因此,我们可以改造一下find里面的参数

let user = await CaseModal.find({
      "attendees.iphone":phone,
      "attendees.name":name
      "attendees":{
        $elemMatch:{
          "iphone":phone,
          "name":name

我们终于得到了我们期望的结果

但是!!!官方文档里有一句话The $elemMatch operator limits the contents of an <array> field from the query results to contain only the first element matching the $elemMatch condition.意思就是说,只会返回数组所有符合元素的第一位元素.所以,很多场景$elemMatch就不适用于,那该用些什么呢?

Aggregation Pipeline(聚合管道)

聚合操作将来自多个文档的值分组在一起,可以对分组的数据执行各种操作以返回单个结果 具体用法查看官方文档

  • $unwind : 将数组类型的字段进行拆分
  • $match : 过滤数据,只输出符合结果的文档
  • $project: 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
  • let user = await CaseModal.aggregate([
            "$unwind":"$attendees"
            "$match":{
              "attendees.iphone":phone,
              "attendees.name":name
            "$project":{
              "attendees" : 1
        "success": true,
        "data": [
                "_id": "604f1e7a63f9ff00126332fc",
                "attendees": {
                    "name": "当事人1",
                    "role": "applicant",
                    "idcard": "123",
                    "iphone": "123",
                    "password": "123456",
                    "inviteCode": "123456"
                "_id": "604f201a63f9ff00126332fe",
                "attendees": {
                    "name": "当事人1",
                    "role": "applicant",
                    "idcard": "123",
                    "iphone": "123",
                    "password": "123456",
                    "inviteCode": "123456"
    

    得到了我们期望的结果

    学习东西,一定要多多查看官方文档,读懂文档,才能正确使用,如果遇到全英文的看不懂的,可以多看几篇别人整理的中文文档,同时也要对照着官方文档,自己做一些整理.这样才能让自己进步哦.加油!