MongoDB查找MainField到FieldA或FieldB

时间:2019-12-02 14:24:27

标签: mongodb mongodb-query aggregation-framework

我需要通过查找来加入两个MongoDB Colletions,要从第一个集合中加入的MainField必须通过Field A或Field B与另一个集合相结合。

  • MainField 是一个数组,其结构为[Doc1.FieldA,Doc2.FieldA,Doc3.FieldB,...]。
  • FieldA 是唯一索引。
  • FieldB 是非唯一索引,用于具有唯一值的FieldB组。

问题是我需要保持MainField Array的顺序。

我喜欢做这样的事情:

db.getCollection("collection1").aggregate([
    $lookup: {
       from: "collection2",
       localField: "mainField",
       foreignField: $or:["fieldA","FieldB"]
       as: "mainFieldInfo"
   }]

是否可以执行此查找,或者我需要其他方法?

  

集合示例,文档简化了,还有更多字段   在每个文档中。

收集机(1个示例):

{
    "_id" : ObjectId("5c793a188021710636865c33"),
    "MachineName" : "CER3A",
    "NextJobs" : [  //--> MainField
        "ST105862", // match with FIELD B - Flags.STS
        "OFT083520", // match with FIELD A - Lote
        "OFT083365", 
        "ST105946"
    ]
}

馆藏作品(2个示例,其中1个与FieldA匹配,1个与Field B匹配):

字段示例: FieldB *(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,
    }
}

1 个答案:

答案 0 :(得分:1)

您必须使用the other form of $lookup stage,它可以为查找阶段执行多个条件。

这是您必须运行的查询:

MPI_Comm_disconnect

您可以here对其进行测试