Mongoose 数组 indexOf 无法正常工作

Mongoose array indexOf not working as it should

我有一个猫鼬文档,看起来像这样:

{  
  "_id":ObjectId("553e4d7a1ebb424364e47e0f"),
  "url":"/api/images/553e4d6f1ebb424364e47e0b",
  "type":"knowledge",
  "title":"asdasd",
  "week":18,
  "fields":{  
    "end":"sdajlsdjlfnsdf",
    "correctAnswer":"2",
    "answers":{  
      "0":"ljnsdlfjnsdfn",
      "1":"lnsldfnlsf",
      "2":"ljsndlfnsdlf"
    },
    "question":"sjlnasjld"
  },
  "participants":[  
    {  
      "user":ObjectId("553e4d531ebb424364e47e07"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e4e3bb4ad1bbb646a545c"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e4ecc007b12e464c6a7ff"),
      "result":{  
        "answer":"1"
      }
    },
    {  
      "user":ObjectId("553e4ecc007b12e464c6a7ff"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e5239b1d44ec7681bcb66"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e52be4d85843e69828df3"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e52cd8dded86469ee3974"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e537b6c4981b169a10c3d"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e5553afb1fd6e6a90e6af"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e55ddda5144976aa90224"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e563af09b82e46ac30c0c"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e563af09b82e46ac30c0c"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e563af09b82e46ac30c0c"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e57b6d554ab136caa95a8"),
      "result":{  
        "answer":"2"
      }
    },
    {  
      "user":ObjectId("553e5a7c094e51826d88dbff"),
      "result":{  
        "answer":"2"
      }
    }
  ]
}

我想做的是限制 'participants' 在他们已经完成任务的情况下参与任务。我正在使用此代码来尝试限制它们,但它没有正常工作:

if (mission.participants && mission.participants.map(function (e) { return e.user; }).indexOf(uid) > -1) {
  return res.send(403, { err: "You've already completed this mission" });
}

无论我怎么尝试 indexOf 函数总是 returns -1

如果我运行console.log(mission.participants.map(function (e) { return e.user; }));我得到

[ 553e4d531ebb424364e47e07,
  553e4e3bb4ad1bbb646a545c,
  553e4ecc007b12e464c6a7ff,
  553e4ecc007b12e464c6a7ff,
  553e5239b1d44ec7681bcb66,
  553e52be4d85843e69828df3,
  553e52cd8dded86469ee3974,
  553e537b6c4981b169a10c3d,
  553e5553afb1fd6e6a90e6af,
  553e55ddda5144976aa90224,
  553e563af09b82e46ac30c0c,
  553e563af09b82e46ac30c0c,
  553e563af09b82e46ac30c0c,
  553e57b6d554ab136caa95a8,
  553e5a7c094e51826d88dbff ]

我已经验证 uid 变量确实在数组中,所以这不是问题所在。

运行 io.js v1.8.1, mongoose v4.0.1, MongoDB v2.6.9

问题是您正在比较一个对象 Schema#ObjectId 和一个 String。您需要在 map 函数中将 ObjectId 转换为 String,以便 indexOf 可以找到所需的 uid:

if (mission.participants && mission.participants.map(function (e) { return e.user.toString(); }).indexOf(uid) > -1) {
  return res.send(403, { err: "You've already completed this mission" });
}