gpt4 book ai didi

node.js - MongoDB:查找两个指定键值相等的项目

转载 作者:可可西里 更新时间:2023-11-01 09:52:21 27 4
gpt4 key购买 nike

我有一个 mongoDB 集合,集合中的一个项目如下所示:

{
"_id": "52f535b56268a019bd11cc2a",
"description": "Some description",
"entry_date": "2014-02-07T19:36:21.430Z",
"last_update": "2014-02-07T19:36:21.430Z",
"r": "samestring",
"s": "samestring"
}

日期是 ISODate 对象。

此查询正确返回项目

db.myCollection.find({$where : "this.entry_date < this.last_update"});

下面的查询什么都不返回(我希望它返回上面的项目):

db.myCollection.find({$where : "this.entry_date == this.last_update"});

此查询返回所有项目(我预计它会再次返回上述项目):

 db.myCollection.find({$where :"this.r == this.s"});

我做错了什么?谢谢!!

---编辑----

所以我尝试用如下的小数据进行测试:

> db.myCollection.find({},{ _id: 0, start_date: 1, end_date: 1});

{
"start_date" : ISODate("2014-02-07T19:36:21.430Z"),
"end_date" : ISODate("2014-02-07T19:36:21.430Z")
}
{
"start_date" : ISODate("2014-02-07T19:36:21.430Z"),
"end_date" : ISODate("2014-02-07T22:39:02.114Z")
}

如您所见,它不适用于 Date:

> db.myCollection.find(
{$where: "Date(this.start_date) == Date(this.end_date)"},
{ _id: 0, start_date: 1, end_date: 1 }
);



{
"start_date" : ISODate("2014-02-07T19:36:21.430Z"),
"end_date" : ISODate("2014-02-07T19:36:21.430Z")
}
{
"start_date" : ISODate("2014-02-07T19:36:21.430Z"),
"end_date" : ISODate("2014-02-07T22:39:02.114Z")
}

适用于字符串值:

> db.myCollection.find({$where: "this.title == this.description"},{ _id: 0, title: 1 });

{ "title" : "samedescription" }

最佳答案

在 JavaScript 中比较日期时必须非常小心 - 使用 valueOf()getTime() :

> db.myCollection.find({$where: "this.start_date.getTime() == this.end_date.getTime()"});

{ "_id" : ObjectId("52f5b7e316d795f0a076fbdf"), "description" : "a description", "title" : "a title", "start_date" : ISODate("2014-02-07T19:36:21.430Z"), "end_date" : ISODate("2014-02-07T19:36:21.430Z") }

这就是您的其他查询不起作用的原因。

db.myCollection.find({$where: "Date(this.start_date) == Date(this.end_date)"});

这没有用,因为您在初始化日期时没有使用 new。这通常会产生令人捧腹的结果,所有日期都彼此相等:

> Date(2014,2,8) == Date(1941,12,7)
true
> Date(2000,1,1) == Date(1995,2,8)
true

但即使您使用 new 正确实例化日期,在使用 == 比较日期时您仍然会得到令人捧腹的结果,如 gist 中所示。 :

var dateValue = 504001800000; // Saturday, December 21st, 1985 at 3:30am EST
var date1 = new Date(dateValue);
var date2 = new Date(dateValue);

console.log(date1 == date2); // false (different instances)
console.log(date1 === date2); // false (different instances)
console.log(date1 > date2); // false (date1 is not later than date2)
console.log(date1 < date2); // false (date1 is not earlier than date2)
console.log(date1 >= date2); // true (rofl)
console.log(date1 <= date2); // true (ahahahaha)

至于您的其他查询:

It didn't work if I consider them as strings either:

db.myCollection.find({$where: "this.start_date == this.end_date"});

您实际上并没有将它们作为字符串进行比较,您是在比较 ISODate 对象,这就是它们的存储方式。对于 ISODate,与 Date 类似,== 运算符将返回 false,除非您比较的是完全相同的实例。然而,使用 getTime 应该可行,这是我在上面所做的。

希望这些都没有任何意义,因为如果有的话,我担心你的理智。

关于node.js - MongoDB:查找两个指定键值相等的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639471/

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