MongoDB v2.4.9按布尔字段排序

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 的文档。换句话说,我需要按照布尔字段进行排序。

以下代码并没有起到作用,因为我仍然得到一些混合了真假的文档。

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

有什么想法吗?


我刚在mongodb v2.2.0上测试了一下,结果如预期的那样良好。 (我是使用原生控制台进行测试的,而不是mongoose) - joao
6
在v2.4.9中它也能正常工作。sort({isFoo:1})返回错误的文档,sort({isFoo:-1})返回正确的文档。 - Anand Jayabalan
“撞头在墙上” 原来我收集的一些文档中,字段isFoo被注册为字符串类型是有问题的。现在我必须弄清楚如何更改该字段的类型。 - McMeep
一个快速的forEach查找所有BSON类型而不是bool应该就可以了。 - Sammaye
1个回答

5

上述代码可行,我的数据有问题。如我在上面的评论中所写,一些文档的isFoo是字符串(而不是布尔值),这就是为什么我看到混合结果的原因。

我必须将字段类型从字符串更改为布尔值,因此尝试了以下操作:

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); });

这真的很烦人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接