猫鼬返回对象做什么内部操作?



我有一个故事可能有点乏味。但我对这个问题真的很困惑。这里是:
我试图更改由我的服务层中的 Mongoose 静态模型方法返回的文章对象的值。对象的外观如下:

{
"_id" : ObjectId("5ddc7ce28251373510d4e49b"),
"tag" : [
"Error handling",
"async/await"
],
"title" : "title",
"content" : "This is an article",
"createdAt" : ISODate("2019-11-26T09:16:18.177+08:00"),
"updatedAt" : ISODate("2019-11-26T10:04:41.636+08:00"),
"view" : [
{
"_id" : ObjectId("5ddc7cee8251373510d4e49c"),
"email" : "123",
"viewAt" : ISODate("2019-11-26T09:16:30.733+08:00")
},
{
"_id" : ObjectId("5ddcdcefa4ac2a9f54228a42"),
"email" : "123",
"viewAt" : ISODate("2019-11-26T16:06:07.310+08:00")
},
],
"thumbUp" : [
{
"email" : "123",
"thumbedAt" : ISODate("2019-11-26T16:46:17.870+08:00")
}
],
"comment" : [
{
"_id" : ObjectId("5ddcea9efa1afbbe082cc051"),
"userId" : "5d836cacc845921e1034f1da",
"text" : "fff",
"commentAt" : ISODate("2019-11-26T17:04:30.166+08:00")
},
],
"__v" : 0
},

然后我在注释数组中使用 userId 进行其他一些数据库查询(例如获取用户名(,并将获取的数据与原始注释数据组合以形成一个新的注释数组。下面是一个新的注释数组的样子:

{
_id: 5ddcea9efa1afbbe082cc051,
userId: '5d836cacc845921e1034f1da',
text: 'This is quite useful!',
commentAt: 2019-11-27T05:59:21.164Z,
username: 'Sherr_Y',
hasAvatar: true
}

然后问题来了:当我尝试用新评论替换原始评论时。我发现没有任何变化。这是我尝试过的:

_data.comment = newCommentArray;
// or
Object.assign(_data, { comment: newCommentArray });

最后,我发现_data不是一个只包含数据的对象。这是它的真实外观:

{
'$__': InternalCache {
strictMode: true,
selected: {},
shardval: undefined,
saveError: undefined,
validationError: undefined,
adhocPaths: undefined,
removing: undefined,
inserting: undefined,
saving: undefined,
version: undefined,
getters: {},
_id: 5ddc7ce28251373510d4e49b,
populate: undefined,
populated: undefined,
wasPopulated: false,
scope: undefined,
activePaths: StateMachine {
paths: [Object],
states: [Object],
stateNames: [Array]
},
pathsToScopes: {},
cachedRequired: {},
session: undefined,
'$setCalled': Set {},
ownerDocument: undefined,
fullPath: undefined,
emitter: EventEmitter {
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: 0
},
'$options': { skipId: true, isNew: false, willInit: true }
},
isNew: false,
errors: undefined,
_doc: {
tag: ["Error handling","async/await"],
_id: 5ddc7ce28251373510d4e49b,
title: 'title',
content: 'This is an article',
createdAt: 2019-11-26T01:16:18.177Z,
updatedAt: 2019-11-26T02:04:41.636Z,
view: [
[Object], [Object]
],
thumbUp: [ [Object] ],
comment: [ [Object] ],
__v: 0
},
'$locals': {},
'$init': true
}

显然,_doc的价值正是我们真正需要的。所以我处理了它const res = Object.assign({ ..._data._doc }, { comment });现在它工作了。即使我可以继续我的工作,我仍然想知道猫鼬返回对象有什么魔力。在这里,我有两个主要问题:

  • 当我在下面尝试时,它只显示我们需要的数据(_doc(:

    console.log(_data);
    // Only output what inside _doc
    

    但是当我在下面尝试时,它会输出整个对象:

    console.log({ ...data });
    // Output the entire object
    

    为什么data{ ...data }在 console.log.Is javascript内部规则时有不同的行为,还是由Mongoose设置的。

  • 当我使用return _data但不return { ..._data }将其从服务返回到控制器时。我仍然可以通过在控制器层console.log({ ...data })来获取整个对象。但是当我使用res.json(_data)将其返回到前端时。无论我做什么,我都只能在_doc内获取数据。似乎res.json(_data)只返回_doc内部的内容。但是这是怎么完成的呢?

如果您创建了猫鼬查询以在数据库中查找某些内容作为答案,则不会只收到一个对象,它将是一个猫鼬查询对象,其中包含许多有用的工作人员,您可以调用返回的猫鼬查询对象在这里,您可以找到有关此查询对象和查询对象方法的更多信息:单体查询对象。

若要更新猫鼬查询对象的某些属性,可以使用此方法:

queryObject.findOneAndUpdate(conditions, update)

我认为它会非常适合

最新更新