gpt4 book ai didi

MongoDB 找不到包含两个不同字段且日期相同的文档

转载 作者:可可西里 更新时间:2023-11-01 10:36:02 26 4
gpt4 key购买 nike

我在我的项目中使用 Postgresql,但最近我遇到了一些性能问题并决定尝试 MongoDB。但是这次我在另一个问题的海洋中,我正在下沉。

我的表/集合中最重要的字段是“开始日期”和“结束日期”,因为有了这些日期,我数据库中的任何帖子都可以在网站上发布或从网站上删除。

这是我的问题,希望有人能帮助我:

当我向数据库中插入一个帖子时,我有两个选择:

1) 这篇文章永远不会从网站上删除。在这种情况下,我使“StartDate”和“EndDate”完全相同(相等)。这意味着该帖子永远不会从网站上删除,并且可以在“开始日期”发布。

2) 这篇文章可以/将从网站上删除。当然,在这种情况下,“StartDate”和“EndDate”是不同的,并且基于这些日期(在这些日期之间)可以在网站上发布帖子。

为什么这对我很重要,因为已删除帖子的标签也需要从标签页面中删除,已删除帖子的 url 也需要从站点地图等中删除...

在我的 postgresql 表中,这不是问题,而且查询非常简单:

SELECT * FROM posts WHERE 
SATUS=true AND (
(enddate = startdate AND startdate <= Now())
OR
(enddate <> startdate AND startdate <= Now() AND enddate > Now())
)

但是在 MongoDB 中,即使我使用等效的语法,我也无法从我的帖子集合中获得正确的结果?

我在 StackOverflow 中搜索了好几天,这是我得到的最完美的聚合语法。 (对于 MongoShell)

以下查询仅返回具有不同“StartDate”和“EndDate”以及当前发布帖子的字段。

OR 的第一个 AND 部分似乎不起作用。只返回第二个 AND 的结果。


var tmpDate = new Date();
db.getCollection('Posts').aggregate([
{ $project : {"_id":1,"Status":1,"EndDate":1,"StartDate":1}},
{ $match :
{ "$and": [
{ "Status": true },
{ "$or": [
{ "$and": [{ "EndDate": { "$eq": "StartDate" } }, { "StartDate": { "$lte": tmpDate } } ] },
{ "$and": [ { "EndDate": { "$ne": "StartDate" } }, { "StartDate": { "$lte": tmpDate } }, { "EndDate": { "$gt": tmpDate } } ] }
]
}
]
}
}
])

最后,我偶然在 StackOverflow 上回答了 MongoDB 无法找到相同日期或无法像其他数据库那样比较它们的情况?

我怎样才能完成这个过滤?或者我应该继续使用 Postgresql。

PS:我正在从 C# 控制台应用程序插入测试文档,并且我正在插入日期作为 ISO 日期:

DateTime tmpNow = DateTime.UtcNow;
tmpNow = Convert.ToDateTime(tmpNow.ToString("yyyy-MM-ddTHH:mm:00")).ToUniversalTime();

我正在按要求添加示例文档:

{
"_id" : NumberLong(1),
"Status" : true,
"Cat" : [
4
],
"Type" : 1,
"Title" : {
"Normal" : "Class aptent taciti sociosqu ad litora torquent per conubia",
"Spot" : null,
"Small" : null,
"Seo" : null
},
"Summary" : "Nam finibus nulla quis.",
"Article" : "<p>Maecenas malesuada augue nec</p>",
"Picture" : {
"Path" : "/Content/Images/detay9.jpg",
"Anchor" : "top",
"Rank" : 0,
"Desc" : null,
"Width" : 843,
"Height" : 1022
},
"Vertical" : null,
"Source" : "StackOverflow",
"Editor" : "An Editor",
"Related" : null,
"Tags" : [
"Causae",
"Nusquam",
"Percipitur",
"Rihanna",
"Saglik"
],
"StartDate" : ISODate("2019-05-05T13:44:00.000Z"),
"EndDate" : ISODate("2019-05-05T13:44:00.000Z"),
"UpdateDate" : ISODate("2019-05-05T13:44:00.000Z"),
"Rank" : 100,
"ReadCount" : 1064,
"Gallery" : null,
"List" : null,
"Shared" : false,
"Video" : null
}

最佳答案

请试试这个,我希望它对你有用:

db.getCollection('Posts').aggregate([
{
$match:
{
"Status": true, "StartDate": { "$lte": tmpDate },
$expr: { $or: [{ $eq: ['$StartDate', '$EndDate'] }, { $gt: ['$EndDate', tmpDate] }] }
}
},
{ $project: {"Status": 1, "EndDate": 1, "StartDate": 1 } }
])

注意:

1) 最终结果如果你想要 _id 然后在 $project 你不需要做 "_id":1 它默认情况下会存在,如果您不想要该字段,则必须提及 "_id":0

2) 回到你的陈述:最后,我在 StackOverflow 回答了这种情况,即 MongoDB 无法找到相同的日期或与其他数据库进行比较?,根据我的经验,如果两个字段的类型相同,我会说我们可以这样做,否则你需要将一个转换为另一种形式,如果你使用 $expr 比较 mongoDB 文档中的两个字段> 会成功的。最好尽早使用 $match,这样您就可以过滤文档,然后执行必要的操作。

关于MongoDB 找不到包含两个不同字段且日期相同的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342366/

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