1

我需要获取detalleInsumos通过该_id对象命名的数组中包含的信息。

我尝试了很多方法,但仍然没有找到解决问题的方法,因为它总是向我显示该文档的所有对象,这对我不起作用。

这是我需要从中获取该信息的文档:

{
    "_id":{"$oid":"5f9041196462be3c5ca1e53d"},
    "codigoFinca":"000",
    "nombreFinca":"PROVINCIANA",
    "fechaRegistro":"2020-10-21",
    "semanaRegistro":"43",
    "usuarioRegistro":"cotorreo",
    "trabajadoresFinca":[
        {
            "porcentajeRecargo":0,
            "_id":{"$oid":"5f9041196462be3c5ca1e53e"},
            "udpTrabajador":[
                {
                    "unidadesAPagar":null,
                    "valorUnidad":"",
                    "areaLaborada":"2",
                    "semanaNormal":null,
                    "semanaAtrazos":null,
                    "_id":{"$oid":"5f9041196462be3c5ca1e53f"},
                    "detalleInsumos":[
                        {"_id":{"$oid":"5f9041196462be3c5ca1e540"},
                         "codigoInsumo":"20000001",
                         "descripcionInsumo":"NYLON X 5 KILOS",
                         "cantidadAplicada":"153",
                         "idRDI":"426715",
                         "idDetalleSaldo":"24070"
                        }
                    ],
                    "codigoLabor":"101",
                    "nombreLabor":"AMARRE",
                    "loteLaboro":"1"
                }
            ],
            "codigoTrabajador":"0000",
            "nombresTrabajador":"HUMBERTO  MENA MOSQUERA",
            "horasJornada":"10",
            "horasLaboradas":"10"
        }
    ],
    "createdAt":{"$date":"2020-10-21T14:09:29.876Z"},
    "updatedAt":{"$date":"2020-10-21T15:09:51.657Z"},
    "__v":0
}

这就是我从nodejs尝试过的:

const consultauno = await Modelo.findOne({
                'trabajadoresFinca.udpTrabajador.detalleInsumos._id': new ObjectId(idInsumo)
            },
            {
                "trabajadoresFinca.udpTrabajador.detalleInsumos": 1
            });
            console.log(consultauno);
4

1 回答 1

0

你可以试试,

  • $match你的情况
  • $reduce迭代trabajadoresFinca数组循环,第二个 $reduce 迭代数组循环,udpTrabajador从数组$filter中获取匹配对象detalleInsumos
  • $arrayElemAt条件匹配时将从数组中获取第一个对象
  • $mergeObjects将合并 initialValue 或减少和匹配对象
const consultauno = await Modelo.aggregate([
  {
    $match: {
      "trabajadoresFinca.udpTrabajador.detalleInsumos._id": ObjectId(idInsumo)
    }
  },
  {
    $project: {
      detalleInsumos: {
        $reduce: {
          input: "$trabajadoresFinca",
          initialValue: {},
          in: {
            $mergeObjects: [
              "$$value",
              {
                $reduce: {
                  input: "$$this.udpTrabajador",
                  initialValue: {},
                  in: {
                    $mergeObjects: [
                      "$$value",
                      {
                        $arrayElemAt: [
                          {
                            $filter: {
                              input: "$$this.detalleInsumos",
                              cond: {
                                $eq: ["$$this._id", ObjectId(idInsumo)]
                              }
                            }
                          },
                          0
                        ]
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

操场


第二种方法,您可以使用$unwind,

  • $match你的条件
  • $unwind解构trabajadoresFinca数组
  • $unwind解构udpTrabajador数组
  • $unwind解构detalleInsumos数组
  • $match你的条件
  • $project显示必填字段
const consultauno = await Modelo.aggregate([
  {
    $match: {
      "trabajadoresFinca.udpTrabajador.detalleInsumos._id": ObjectId(idInsumo)
    }
  },
  { $unwind: "$trabajadoresFinca" },
  { $unwind: "$trabajadoresFinca.udpTrabajador" },
  { $unwind: "$trabajadoresFinca.udpTrabajador.detalleInsumos" },
  {
    $match: {
      "trabajadoresFinca.udpTrabajador.detalleInsumos._id": ObjectId(idInsumo)
    }
  },
  {
    $project: {
      trabajadoresFinca: "$trabajadoresFinca._id",
      udpTrabajador: "$trabajadoresFinca.udpTrabajador._id",
      detalleInsumos: "$trabajadoresFinca.udpTrabajador.detalleInsumos"
    }
  }
])

操场

于 2020-10-23T17:01:10.613 回答