MongoDB查找主字段到字段A或字段B

MongoDB查找主字段到字段A或字段B,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我需要使用lookup连接两个MongoDB集合,要从de first集合连接的主字段必须通过字段A或字段B与其他集合连接 MainField是一个数组,具有此结构[Doc1.FieldA,Doc2.FieldA,Doc3.FieldB,…] 字段A是唯一索引 字段B是非唯一索引,用于具有唯一值的组字段B 问题是我需要保持MainField数组的顺序 我喜欢这样做: db.getCollection("collection1").aggregate([ $lookup: {

我需要使用lookup连接两个MongoDB集合,要从de first集合连接的主字段必须通过字段A或字段B与其他集合连接

  • MainField是一个数组,具有此结构[Doc1.FieldA,Doc2.FieldA,Doc3.FieldB,…]
  • 字段A是唯一索引
  • 字段B是非唯一索引,用于具有唯一值的组字段B
问题是我需要保持MainField数组的顺序

我喜欢这样做:

db.getCollection("collection1").aggregate([
    $lookup: {
       from: "collection2",
       localField: "mainField",
       foreignField: $or:["fieldA","FieldB"]
       as: "mainFieldInfo"
   }]
是否可以执行此查找,或者我需要其他方法

集合示例中,文档被简化,有更多字段 在每个文件中

收集机器(1个示例):

收集工作(2个示例,1个与字段A匹配,1个与字段B匹配):

字段示例: 字段B*(Flags.STS)*为空

{
    "_id" : ObjectId("5c1b89d0b6e97d001816595e"),
    "Lote" : "OFT083520", //--> FIELD A 
    "Flags" : {
        "ShipsFinished" : true,
        "PlanFinished" : true,
        "Finished" : true,
        "IdDefecto" : false,
        "EstadoOF" : 4,
        "GCT" : "GCT018929",
        "PedidoVenta" : "",
        "STS" : "", //--> FIELD B
    }
}
字段B示例(2个文档): FieldA*(Lote)*在每个文档中是不同的,FieldB*(Flags.STS)*是相等的

{
    "_id" : ObjectId("5dcd78e2a2061070185400e2"),
    "Lote" : "OFT083671", //--> FIELD A
    "Flags" : {
        "B2" : 1,
        "EstadoOF" : 4,
        "Finished" : false,
        "GCT" : "GCT024270",
        "LaSI" : 0,
        "PedidoVenta" : "P056048",
        "SPO" : "PO23579",
        "STS" : "ST105862", //--> FIELD B
        "Inks" : "true",
    }
}

{
    "_id" : ObjectId("5dcd78e2a2061070185401f0"),
    "Lote" : "OFT083672", //--> FIELD A
    "Flags" : {
        "B2" : 1,
        "EstadoOF" : 4,
        "Finished" : false,
        "STS" : "ST105862", //--> FIELD B
        "ShipsFinished" : false,
        "TipoOF" : 1,
        "EstatIQC" : 1,
    }
}
您必须使用,它允许为查找阶段执行多个条件

以下是您必须运行的查询:

db.machines.aggregate([
  {
    $lookup: {
      from: "works",
      let: {
        "nj": "$NextJobs"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $or: [
                {
                  $in: [
                    "$Lote",
                    "$$nj"
                  ]
                },
                {
                  $in: [
                    "$Flags.STS",
                    "$$nj"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "linkedWorks"
    }
  }
])

您可以测试它

请共享您的文档示例添加的文档示例!这回答了你的问题吗?非常感谢,它很有效。但我有一个问题,是否有可能保持NextJobs数组的顺序?通过$lookup设计,没有,但您可以在这里找到完整的答案
db.machines.aggregate([
  {
    $lookup: {
      from: "works",
      let: {
        "nj": "$NextJobs"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $or: [
                {
                  $in: [
                    "$Lote",
                    "$$nj"
                  ]
                },
                {
                  $in: [
                    "$Flags.STS",
                    "$$nj"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "linkedWorks"
    }
  }
])