我正在使用$in
搜索一个数组,在没有指定排序的情况下返回结果的顺序是什么?我想让它们按照我搜索的数组的顺序返回。
答案 0 :(得分:2)
一般情况下:如果您没有指定排序顺序进行搜索,则无法保证结果的排序。
此外,无法按数组排序(如果您想按照所述按数组对数组进行排序,则更少)。 sort()使用逻辑比较来根据结果文档中的字段确定升序或降序。
您必须在自己的应用程序代码中实现任何所需的自定义排序逻辑。
一种有用的方法可能是利用MongoDB 2.2中的新Aggregation Framework ..特别是能够将$unwind数组放入文档流中。
例如,将测试数据设置为:
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
{2,3}上的$in
搜索会产生匹配的文档:
> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
使用聚合框架,您可以$match
使用相同的文档,然后操作结果以实现一些基本排序:$unwind
数组,$sort
,然后$group
这些回到了结果:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
因此,在此示例中,具有匹配数组的文档现在按数组值的升序排序:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}
答案 1 :(得分:0)
简短回答:这是不可能的。