gpt4 book ai didi

node.js - 我如何为多个集合做 Mongodb 聚合过滤器?

转载 作者:行者123 更新时间:2023-12-04 07:38:30 24 4
gpt4 key购买 nike

我有两个收集预订和发票,我准备了以下条件的汇总和查找查询
预订收集条件
条件 1:状态不等于已交付
条件 2:产品不应为 null 或为空
条件 3:ProductID 应存在于 products 数组中且不应为空
条件 4:IsDeliveryFailed 不应为"is"
预订收集数据

{
"_id" : ObjectId("609a382b589346973c84c6fe"),
"Name" : "abc",
"UserId":1
"Status" : "Pending",
"Invoices" : [
ObjectId("709a382b5c6fe89346973c84")
],
"BookingData" : {
"Date" : ISODate("2021-04-30T04:00:00.000Z"),
"info" : [],
"BookingDataMethod" : "avf",
"Message" : null,
"products" : [
{
"_id" : ObjectId("60a4e92775e5de3570578820"),
"ProductName" : "Test1",
"ProductID" : ObjectId("60a4e92475e5de357057880a"),
"IsDeliveryFailed" : "Yes"
},
{
"_id" : ObjectId("60a4e92775e5de357057881f"),
"ProductName" : "Test2",
"ProductID" : ObjectId("60a4e92475e5de357057880d")
}
],

}

}
发票收集条件
条件 1:InvoiceData 不应为 null 或为空
条件 2:InvoiceID 应存在于 InvoiceData 数组中且不应为空
条件 3:IsPaymentFailed 不应为"is"
发票采集数据
{
"_id" : ObjectId("709a382b5c6fe89346973c84"),
"invoiceNumber":1
"InvoiceData" :[
{
"_id" : ObjectId("60a4e92775e5de3570578820"),
"ProductName" : "Test1",
"InvoiceID":1,
"IsPaymentFailed" : "Yes"
},
{
"_id" : ObjectId("60a4e92775e5de357057881f"),
"InvoiceID":2,
"ProductName" : "Test2",

}

]

}
查询
db.bookings.aggregate([
{
"$match": {
"Status": {
$ne: "Delivered"
}
}
},
{
"$lookup": {
"from": "invoices",
"localField": "Invoices",
"foreignField": "_id",
"as": "invoiceInfo"
}
},
{
"$match": {
"$or": [
{
"BookingData.products": {
"$exists": true
}
},
{
"invoiceInfo.InvoiceData": {
"$exists": true
}
}
]
}
},
{
$set: {
"BookingData.products": {
"$filter": {
"input": "$BookingData.products",
"cond": {
$and: [
{ $ne: [ "$$this.ProductID", undefined ] },
{ $ne: [ "$$this._id", null ] },
{ $ne: [ "$$this.IsDeliveryFailed", "Yes" ] }
]
}
}
}
}
},
{
$set: {
"invoiceInfo.InvoiceData": {
"$filter": {
"input": "$invoiceInfo.InvoiceData",
"cond": {
$and: [
{ $ne: [ "$$this.InvoiceID", undefined ] },
{ $ne: [ "$$this._id", null ] },
{ $ne: [ "$$this.IsPaymentFailed", "Yes" ] }
]
}
}
}
}
},
{
$match: {
$expr: {
$or: [
{
$ne: [
"$BookingData.products",
[],

]
},
{
$ne: [
"$invoiceInfo.InvoiceData",
[],

]
}
]
}
}
}

])
这不能按预期工作,例如,如果
查询应返回上述文档
如果 ProductID 存在且产品存在且所有产品都没有 IsDeliveryFailed:"is"
如果 ProductID 存在且产品存在且任何产品都没有 IsDeliveryFailed:"is"
如果 InvoiceID 存在且 InvoiceData 存在且所有 InvoiceData 都没有 IsPaymentFailed:"is"
如果 InvoiceID 存在并且 InvoiceData 存在并且任何 InvoiceData 没有 IsPaymentFailed:"is"
另一套
如果 ProductID 存在且产品存在且所有产品都是 IsDeliveryFailed:"is"标志。但我们必须检查发票收集
如果 InvoiceID 存在并且 InvoiceData 存在并且任何 InvoiceData 没有 IsPaymentFailed: "Yes"那么我们必须返回这个文档
如果 InvoiceID 存在且 InvoiceData 存在且所有 InvoiceData 都是 IsPaymentFailed:"is"。但我们必须检查预订集合
如果 ProductID 存在并且产品存在并且任何产品都没有 IsDeliveryFailed:"Yes"那么我们必须返回文档
Mongo playground

最佳答案

我已经在 Question 中解释了您之前的问题.由于invoiceInfo 是一个数组和invoiceData也是一个数组 invoiceInfo ,我们使用 map 和过滤器。然后我们需要排除 invoiceData 的空数组. (这也可以在上一步中完成,就像 filter-map->filter 一样,但它可能很长,这就是我在下一阶段使用它的原因)
这是代码

db.bookings.aggregate([
{
"$match": {
"PaymentStatus": { $ne: "Delivered" }
}
},
{
$set: {
"BookingData.products": {
"$filter": {
"input": "$BookingData.products",
"cond": {
$and: [
{ $ne: [ "$$this.ProductID", undefined ] },
{ $ne: [ "$$this._id", null ] },
{ $ne: [ "$$this.IsDeliveryFailed", "Yes" ] }
]
}
}
}
}
},
{
"$lookup": {
"from": "invoices",
"localField": "Invoices",
"foreignField": "_id",
"as": "invoiceInfo"
}
},
{
$set: {
invoiceInfo: {
$map: {
input: "$invoiceInfo",
as: "info",
in: {
InvoiceData: {
$filter: {
input: "$$info.InvoiceData",
as: "data",
"cond": {
$and: [
{ $ne: [ "$$data.InvoiceID", undefined ] },
{ $ne: [ "$$data.InvoiceID", null ] },
{ $ne: [ "$$data.IsPaymentFailed", "Yes" ] }
]
}
}
}
}
}
}
}
},
{
$set: {
invoiceInfo: {
$filter: {
input: "$invoiceInfo",
cond: { $ne: [ "$$this.InvoiceData", [] ] }
}
}
}
},
{
$match: {
$expr: {
$or: [
{ $ne: [ "$BookingData.products", [] ] },
{ $ne: [ "$invoiceInfo", [] ] }
]
}
}
}
])
工作Mongo playground
希望这会帮助你。这是您需要根据您的要求播放/解决方法的时间。有时你需要在演示中的当前位置之前或之后进行查找

关于node.js - 我如何为多个集合做 Mongodb 聚合过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67618691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com