簡體   English   中英

如何使用nodejs和mongodb獲取另一個對象內部的對象?

[英]How do I get an object that is inside another with nodejs and mongodb?

我需要通過該對象的_id獲取名為detalleInsumos的數組中包含的信息。

我嘗試了很多方法,但我仍然沒有找到解決我的問題的方法,因為它總是向我顯示該文檔的所有對象,這對我不起作用。

這是我需要從中獲取該信息的文檔:

{
    "_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);

你可以試試,

  • $match你的條件
  • $reduce迭代trabajadoresFinca數組的循環,第二個 $reduce 迭代udpTrabajador數組的循環, $filterdetalleInsumos數組中獲取匹配的對象,
  • $arrayElemAt將在條件匹配時從數組中獲取第一個對象
  • $mergeObjects將合並 initialValue 或 reduce 並匹配對象
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"
    }
  }
])

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM