微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 javascript 对象数组在 mongodb 中中查找或聚合对象的字段?

如何解决如何在 javascript 对象数组在 mongodb 中中查找或聚合对象的字段?

我希望在我的猫鼬模式中有字段 contractType,它是一个对象数组,每个对象都将 authorizedBy 属性放入第二级。

contractType 字段可能有很多项,我想知道每个 authorizedBy 在其他名为 admins 的集合中找到它(我会下面也是)。

const professionalSchema = new Schema(
  firstName: String,contractType: [
    new Schema(
      {
        contract: String,authorizedBy: {
          type: ObjectId,ref: 'admin',index: true,},document: String
      },{
        timestamps: true,versionKey: false,),],)

这是我的管理员收藏。

const adminSchema = new Schema(
  {
    firstName: String,lastName: String,role: String
  },{
    timestamps: true,)

我在 professionalSchema mongodb compass 中有这个:

{
  "_id": ObjectId("6009a0d0874f0900086ee0ce"),"firstName": "xxxx","gender": "NOT_SPECIFIED","contractType": [
    {
      "authorizedBy": ObjectId("5fad90665d963cbbbd4a6580"),"document": "document 1"
    },{
      "authorizedBy": ObjectId("5fad90665d963cbbbd4a6580"),"document": "document 2"
    }
  ]
}

这是管理员集合的管理员 (adminSchema):

{
  "_id": ObjectId("5fad90665d963cbbbd4a6580"),"role": "SAM","firstName": "firstname","lastName": "lastname"
}

我会得到像下面这样的响应,另外我想获取对象的所有字段(20 aprox),而不是手动添加每个字段,例如 javascript 中的扩展运算符(...item)

{
  "_id": ObjectId("6009a0d0874f0900086ee0ce"),"contractType": [
    {
      "authorizedBy": {
        "_id": "5fad90665d963cbbbd4a6580","lastName": "lastname","role": "SAM"
      },{
      "authorizedBy": {
        "_id": "5fad90665d963cbbbd4a6580","document": "document 2"
    }
  ]
}

我在 mongo compass 中试过这个。

[
  {
    '$match': {
      '_id': new ObjectId('6009a0d0874f0900086ee0ce')
    }
  },{
    '$unwind': {
      'path': '$contractType'
    }
  },{
    '$lookup': {
      'from': 'admins','localField': 'contractType.authorizedBy','foreignField': '_id','as': 'contractType.authorizedBy'
    }
  },{
    '$unwind': {
      'path': '$contractType.authorizedBy'
  }
  },{
    $group': {
      '_id': '$_id'
    }
  }
]

但我不知道如何将其余元素(大约 20 个)放在同一个对象中:(

解决方法

你所做的几乎是正确的,

db.professionalSchema.aggregate([
  {"$match": {"_id": ObjectId("6009a0d0874f0900086ee0ce") } },{"$unwind": {"path": "$contractType" }},{
    "$lookup": {
      "from": "adminSchema","localField": "contractType.authorizedBy","foreignField": "_id","as": "contractType.authorizedBy"
    }
  },{
    "$addFields": {
      "contractType.authorizedBy": {
        $ifNull: [
          {  $arrayElemAt: [ "$contractType.authorizedBy",0 ] },""
        ]
      }
    }
  },{
    "$group": {
      "_id": "$_id","firstName": { $first: "$firstName" },"gender": { $first: "$gender"},contractType: { $push: "$contractType" }
    }
  }
])

工作Mongo playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。