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" });
}
我有一个猫鼬文档,看起来像这样:
{
"_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" });
}