Node.js MongoDB:查找两个指定键值相等的项
我有一个mongoDB集合,集合中的一个项目如下所示:Node.js MongoDB:查找两个指定键值相等的项,node.js,mongodb,node-mongodb-native,Node.js,Mongodb,Node Mongodb Native,我有一个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" } > db.myCollection.find
{
"_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"
}
> 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")
}
日期是等日期对象
此查询正确返回项目
db.myCollection.find({$where : "this.entry_date < this.last_update"});
这个查询返回所有项(我也希望它返回上面的项):
我做错了什么?
谢谢
---编辑----
因此,我尝试使用如下小数据进行测试:
{
"_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"
}
> 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" }
适用于字符串值:
> 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" }
--编辑--
你在找接线员。您的查询必须使用有效的JSON表示法,并且在该运算符之外,没有其他权限访问这种原始JavaScript表示法
日期
最后:
{$where: "this.start_date.valueOf() == this.end_date.valueOf()"}
还要注意不要碰到保留字和其他陷阱
请仔细阅读有关此操作员的文档,并确保您绝对需要它。它将大大降低速度,因为您的发现将扫描整个收藏。它不能使用索引。在JavaScript中比较日期时,您必须非常小心-使用或: 以下是其他查询不起作用的原因
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
正确地实例化了日期,在使用=
比较日期时仍然会得到有趣的结果,如下所示:
var dateValue=504001800000;//1985年12月21日星期六美国东部时间凌晨3:30
var date1=新日期(dateValue);
var date2=新日期(dateValue);
console.log(date1==date2);//false(不同实例)
console.log(date1==date2);//false(不同实例)
console.log(date1>date2);//false(日期1不晚于日期2)
console.log(date1=date2);//真实(rofl)
console.log(date1谢谢Neil我编辑了我的问题。我实际上也使用了$where运算符。它不会改变结果。如果您不理解我的问题,我可以尝试以不同的方式解释。@user3211198您的日期比较在我自己的编辑中是显而易见的。字符串没有理由不匹配,除非它们确实不相等。我尝试过了使用Date和Not work可能我的数据或代码有问题。我可以使用这个:使用dates吗?并查询field3 value=0,但我猜$where仍然是必需的,不是吗?@user3211198您可以使用我在上面的答案中键入的内容。如果没有,我知道您断言您有ISODate对象,但如果您包含的文档是sample是mongo shell的一个完全转储文件,它们实际上是字符串。除了我提供的答案之外,没有其他答案。如果你没有得到你所期望的,那么问题是你的数据。@Neil_Lunn你能看到第二次编辑吗?不知怎的,你的建议对日期不起作用。知道吗?谢谢我尝试了你对该文档和那些文档的查询最后两个对你不起作用的问题对我来说很好。谢谢,我会仔细检查查询。@JohnnyHK知道为什么它对日期不起作用吗?要知道,当你使用$where
时,必须扫描集合中的所有文档。这是非常低效的。如果你能在文档中存储预静音的结果并对它们进行索引,你会有很多好处整体性能更好。@WiredPairie假设我再次创建了一个字段“预静音=开始日期-结束日期”,我需要使用$where来查找该字段值等于零的项,以查找开始日期=结束日期的项。您能解释一下您对这个示例的建议吗?谢谢