mongoose 数组,包含始终为假的javascript

5t7ly7z5  于 2023-01-09  发布在  Go
关注(0)|答案(4)|浏览(98)

我有以下目的

{ _id: 58ae39c54473f9cfd4eb29b6,
  email: 'another@club.com',
  name: 'Another Club Renamed',
  __v: 0,
  createdEvents: [],
  instructors: [ 58a5ac4f84230a2117d1d6cb, 111111111111111111111111 ],
  members: [] }

当我使用这个方法时
一个月一个月一个月一个月一个月

x1米2英寸x1米3英寸
结果总是假的我做错了什么吗
Array.isArray(club.instructors)返回真
编辑:该对象是一个mongoose.document,上面的对象正是我执行时它记录到控制台的方式

Club.findById(id (err, club) =>{
    console.log(club);
})
eagi6jfj

eagi6jfj1#

mongo_id是12字节BSON类型对象Id,
因此,正常的object.instructors.includes('58a5ac4f84230a2117d1d6cb')意味着将原始字符串与ObjectId进行比较,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

假设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
bjg7j2ky

bjg7j2ky2#

正如Pointy所指出的(呵呵),您在数组中使用的值58a5ac4f84230a2117d1d6cb不是一个有效的数字,可能由于该无效性,您的对象没有被正确定义,因此所有内容都将返回false,因为没有定义任何内容。
我已经在object.instructors.includes(111111111111111111111111)上测试过了,它工作正常。我相信你的问题出在58a5ac4f84230a2117d1d6cb上,如果你真的想保留它,应该用引号括起来,变成一个字符串。

vktxenjb

vktxenjb3#

如果你在js循环中使用includes,注意在for ... in循环和传统循环之间有一个 * tickle note *。)

    • for ... in循环仅迭代可枚举属性。从内置构造函数(如Array和Object)创建的对象从Object. prototype和String. prototype继承了不可枚举属性,如String的indexOf()方法或Object的toString()方法。**

该循环将迭代对象本身的所有可枚举属性以及对象从其构造函数原型继承的属性(原型链中距离对象较近的属性覆盖原型的属性)。
参考:Mozilla Web docs for javascript

var array = [1, 2, 3, 4, 5]

console.log('** using for..in loops i actually is String')

for (var i in array)
    console.log(array.includes(i))
    
console.log('** using traditional for loops i is integer')

for (var i = 0; i < array.length; i++)
    console.log(array.includes(i))
cig3rfwq

cig3rfwq4#

如果你正在做一个搜索运算符,根据搜索的第一个结果,你可以尝试这个...
设{... x} =数组1;
控制台.日志(Array2.map((a)=〉a.字段).包含(x[0].字段))

相关问题