MongoDB查找主字段到字段A或字段B
我需要使用lookup连接两个MongoDB集合,要从de first集合连接的主字段必须通过字段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: {
- MainField是一个数组,具有此结构[Doc1.FieldA,Doc2.FieldA,Doc3.FieldB,…]
- 字段A是唯一索引
- 字段B是非唯一索引,用于具有唯一值的组字段B
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"
}
}
])