MongoDB v2.4.9 按布尔字段排序

Posted

技术标签:

【中文标题】MongoDB v2.4.9 按布尔字段排序【英文标题】:MongoDB v2.4.9 sort by boolean field 【发布时间】:2014-05-13 20:19:10 【问题描述】:

如何根据布尔字段对查询结果进行排序?

考虑以下集合:

 "_id" : ObjectId("..."), "name" : "John" , "isFoo" : true
 "_id" : ObjectId("..."), "name" : "Jim" , "isFoo" : false
 "_id" : ObjectId("..."), "name" : "Joel" , "isFoo" : false
 "_id" : ObjectId("..."), "name" : "Jill" , "isFoo" : true
 "_id" : ObjectId("..."), "name" : "Samantha" , "isFoo" : true

我需要一个查询,它首先返回 isFoo == true,然后返回 isFoo == false 文档。换句话说,我需要按布尔字段排序。

以下代码无法解决问题,因为我仍然得到一些带有isFoo == true 的文档与虚假文档混合在一起。

db["users"].find().sort(  isFoo: 1  )

想法?

【问题讨论】:

我刚刚在 mongodb v2.2.0 上对其进行了测试,并且可以正常工作。 (我使用本机控制台进行测试,而不是猫鼬) 它在 v2.4.9 中也可以正常工作。 sort(isFoo:1) 先返回假文件,sort(isFoo:-1) 先返回真文件。 一头扎进墙 原来我在集合中有一些错误的文档,其中字段 isFoo 已注册为字符串。现在我必须弄清楚如何更改字段的类型。 快速 forEach 查找所有 BSON 类型而不是 bool 应该这样做 【参考方案1】:

上面的代码有效,我的数据很糟糕。 正如我在上面的评论中所写,一些文档将 isFoo 作为字符串(不是布尔值),这就是我看到混合结果的原因。

我不得不将字段的类型从 String 更改为 Boolean,所以我尝试了这个:

db.users.find(  'isFoo' :  $exists : true   ).forEach( function (x)    x.isFoo = new Boolean(x.isFoo);    db.users.save(x); );

但这只是将所有 isFoo 字段都变成了对象。

看到我真的厌倦了处理这个问题,我只是使用以下内容将所有 isFoo 字段设置为 false 并手动处理更改。

db.users.find(  'isFoo' :  $exists : true   ).forEach( function (x)    x.isFoo = false;    db.users.save(x); );

这很烦人。

【讨论】:

以上是关于MongoDB v2.4.9 按布尔字段排序的主要内容,如果未能解决你的问题,请参考以下文章

mongodb v2.4.9 快速操作记录

如何在 mongoDb 中按多个字段排序

MongoDB:考虑到多个字段,我如何按距离排序?

MongoDB:考虑到多个字段,我如何按距离排序?

Paginate Mongoose / MongoDB查询:从一个点开始按两个字段排序[重复]

使用mongoose在mongodb中按升序和降序对多个字段进行排序