为了账号安全,请及时绑定邮箱和手机立即绑定

Mongoose 如何通过 findOne 获取文档中的嵌套对象

Mongoose 如何通过 findOne 获取文档中的嵌套对象

慕哥9229398 2023-04-20 10:23:03
我需要在某个文档(按用户 ID 搜索)中获取一个嵌套对象,该对象内部也有一个对象(不能保证该对象是同一个对象)。我的用户模型是:const mongoose = require('mongoose');const { bool } = require('@hapi/joi');const monitoringSchema = new mongoose.Schema({    type: Object,    default: {}})const hubSchema = new mongoose.Schema({    hubID: {        type: String,        default: ""    },    isSetup: {        type: Boolean,        default: false    },    monitoring: {        type: monitoringSchema    }}, {strict:false})const finalUserSchema = new mongoose.Schema({    username: {        type: String,        required: true,        max: 255    },    email: {        type: String,        required: true,        max: 255,    },    password: {        type: String,        required: true,        min: 10,        max: 1024,    },    date: {        type: Date,        default: Date.now    },    isVerified: {        type: Boolean,        default: false    },    hub: {        type: hubSchema    }},  {strict:false});module.exports = mongoose.model('User', finalUserSchema);或者它有布局:_id: "id"isVerified: trueusername: "nathan"email: "email@email.com"hub:    hubID: "id"    monitoring: // WHOLE OBJECT I NEED TO RETREIVE        exampleObject:             exampleValue: exampleKey我有一组需要更新的用户 ID,我尝试了查询:for(i in usersToUpdate){        User.findOne({_id: usersToUpdate[i], "hub.monitoring": {}}, {}, callbackResponse);        function callbackResponse(err, data){            if(err) return console.log(err)            console.log(data)        }    }但它null作为数据返回,所以显然查询是错误的。我知道错误是:{_id: usersToUpdate[i], "hub.monitoring": {}}进一步来说:"hub.monitoring": {}我{}在监视中用来引用一个对象,引用未知对象并取回它的值的正确引用是什么,比如通配符?我试过了: {_id: usersToUpdate[i], "hub.monitoring": Object}它仍然不起作用。我看过这个答案,但是他们引用了一个他们已经知道的值,比如名字?
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

要仅检索monitoring对象,aggregation可以使用管道。

用于$match过滤和$project输出/抑制字段。

User.aggregate([

  {

    $match: {

      _id: mongoose.Types.ObjectId(usersToUpdate[i]),

    },

  },

  {

    $project: {

      monitoring: "$hub.monitoring",

      _id: 0,

    },

  },

]).exec(callbackResponse); 


查看完整回答
反对 回复 2023-04-20
?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以尝试使用 findOne 的 2 对象形式,其中第一个对象是查询,第二个对象是您要返回的内容的投影。


User.findOne({_id: usersToUpdate[i]}, {"hub.monitoring": {$exists: true}}, callbackResponse);

function callbackResponse(err, data){

    if(err) return console.log(err)

    console.log(data)

}

这样,如果监控对象存在,就会返回该对象。


查看完整回答
反对 回复 2023-04-20
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信