我有一个关于在猫鼬中复制或映射查询结果的问题。以下是我的代码。
const user = await User.find({ birthYear: 1990 }).populate("friends").exec();
console.log(user); // (1)
console.log({ ...user }); // (2)
我认为(1)的结果和(2)的结果应该相同,但结果却大不相同。 (1)打印由birthYear
过滤的文档数组。但是,(2)打印一个键为数字的映射,我认为这似乎是数组的索引。你能告诉我为什么会这样吗?
(1)的结果
[
{
_id: ...,
birthYear: 1990,
lotsOfData: ...,
},
{
_id: ...,
birthYear: 1990,
lotsOfData: ...,
}
]
(2)的结果
{
'0': {
_id: ...,
birthYear: 1990,
lotsOfData: ...,
},
'1': {
_id: ...,
birthYear: 1990,
lotsOfData: ...,
}
}
答案 0 :(得分:2)
猫鼬的find()
方法总是在等待时返回一个数组,因此您应该调用数组users
而不是user
。要复制阵列,您应该使用
console.log( ...user );
在您的代码中,您将基于提供的数组构建一个新的JS对象。因此,spread运算符将数组索引作为键,并将数组的对象作为值放入新对象中(因为使用了花括号)。
因此,您混合了两个散布运算符用例:...array
复制一个数组,而{ ...obj }
用obj
字段填充新对象。在这种情况下,JavaScript运行时会将数组“视为”对象,因此将其索引作为键进行评估。