xer*_*ant 4 javascript arrays mongoose
我有以下对象
{ _id: 58ae39c54473f9cfd4eb29b6,
email: 'another@club.com',
name: 'Another Club Renamed',
__v: 0,
createdEvents: [],
instructors: [ 58a5ac4f84230a2117d1d6cb, 111111111111111111111111 ],
members: [] }
Run Code Online (Sandbox Code Playgroud)
当我使用该方法时
object.instructors.includes(58a5ac4f84230a2117d1d6cb)
object.instructors.includes(111111111111111111111111)
或者
object.instructors.includes('58a5ac4f84230a2117d1d6cb')
object.instructors.includes("111111111111111111111111")
结果总是错误我做错了什么吗?
Array.isArray(club.instructors) 返回真
编辑:对象是一个mongoose.document. 上面的对象正是我执行时它被记录到控制台的方式
Club.findById(id (err, club) =>{
console.log(club);
})
Run Code Online (Sandbox Code Playgroud)
mongo _id 是 12 字节的 BSON 类型 ObjectId,
所以正常object.instructors.includes('58a5ac4f84230a2117d1d6cb')意味着您将原始字符串与 ObjectId 进行比较,后者不是有效的整数或字符串,它将始终返回 FALSE。
注意:进一步理解的提示
使用 lodash 检查存储在多个集合中的相同 ObjectId
npm i lodash --save
在你的 file.js
const _ = require('lodash');
lodash_.isEqual在两个值之间进行深度比较以确定它们是否相等
使用 lodash 并执行_.isEqual深度比较
_.isEqual(object._id, '58ae39c54473f9cfd4eb29b6') // false
_.isEqual(object.instructor[0], '58a5ac4f84230a2117d1d6cb') // false
Run Code Online (Sandbox Code Playgroud)
假设id 58ae39c54473f9cfd4eb29b6来自两个不同的 mongodb 文档
集合用户:[{_id: 58ae39c54473f9cfd4eb29b6, name: 'user1' }]
假设这个用户被引用到rooms集合:
收集室: [{_id: ObjectId, name: 'room1', userId: 58ae39c54473f9cfd4eb29b6}]
如果你做一个正常的比较===或者includes像这样
if (user[0]._id === rooms[0].userId) // false due to different instances
_.isEqual(user[0]._id, rooms[0].userId) // true performs deep comparison
Run Code Online (Sandbox Code Playgroud)