gpt4 book ai didi

日期数组的 MongoDB 过滤器查询返回空数组

转载 作者:行者123 更新时间:2023-12-05 02:56:29 24 4
gpt4 key购买 nike

我有一个 MongoDB 文档,其中包含有关产品及其变体的信息,结构示例如下。

{
"site_id": 3,
"status": 2,
"tags": [],
"title": "WORTHBUY Bento Lunch Box for Kids, 2 Compartments Stainless Steel Square Lunch Box with Portable Cutlery, Portion Control Food Storage Container Leakproof, BPA Free(Pink)",
"total_sold_count": 3,
"amount_of_variations": 3,
"variations": [{
"price": 9.66,
"shipping_price": 0,
"quantity": 0,
"sold_count": 1,
"sold_dates": [
ISODate("2020-03-03T17:00:00.000-07:00")
]
},
{
"price": 18.42,
"shipping_price": 0,
"quantity": 0,
"sold_count": 1,
"sold_dates": [
ISODate("2020-03-03T17:00:00.000-07:00")
]
},
{
"price": 18.42,
"shipping_price": 0,
"quantity": 0,
"sold_count": 1,
"sold_dates": [
ISODate("2020-03-03T17:00:00.000-07:00"),
ISODate("2020-03-09T20:30:56.000-06:00")
]
}
]
}

我正在尝试获取在特定日期之后售出的所有变体。为此,我使用了以下 mongo 聚合查询,但在结果中,我得到了一个空的变体列表。

db.products.aggregate([{
$match: {
"variations.sold_dates": {
$gt: ISODate("2020-03-05 00:00:00")
}
}
}, {
$addFields: {
"variations": {
$filter: {
input: "$variations",
as: "variations",
cond: {
$and: [{
$gt: ["$$variations.sold_dates", ISODate("2020-03-05 00:00:00")]
}]
}
}
}
}
}])

此查询适用于除此日期列表之外我尝试过的所有其他字段。知道我做错了什么吗?

最佳答案

由于 variations.sold_dates 是一个日期数组,您不能比较给定日期是否大于 sold_dates。因此,您需要迭代 variations.sold_dates 数组的每个元素并检查是否大于 while 迭代,因为 $filter 返回一个过滤器元素数组,然后您可以检查大小该数组 > 0 以将变体对象添加到 $addFields 中的变体数组。试试这个查询:

db.collection.aggregate([
{
$match: {
"variations.sold_dates": {
$gt: ISODate("2020-03-05T00:00:00Z")
}
}
},
{
$addFields: {
"variations": {
$filter: {
input: "$variations",
as: "variation",
cond: {
$gt: [
{
$size: {
$filter: {
input: "$$variation.sold_dates",
cond: {
$gt: [
"$$this",
ISODate("2020-03-05T00:00:00.000Z")
]
}
}
}
},
0
]
}
}
}
}
}
])

测试: MongoDB-Playground

关于日期数组的 MongoDB 过滤器查询返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518581/

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