1

我正在使用 搜索数组$in,在没有指定排序的情况下返回结果的顺序是什么?我希望它们按我搜索的数组的顺序返回。

4

2 回答 2

2

一般来说:如果您在没有指定排序顺序的情况下进行搜索,则无法保证结果的排序。

此外,不可能按数组排序(如果您想按所述数组对数组进行排序,则更是如此)。sort()使用逻辑比较来根据结果文档中的字段确定升序或降序。

您必须在自己的应用程序代码中实现任何所需的自定义排序逻辑。

一种有用的方法可能是利用 MongoDB 2.2 中的新聚合框架.. 特别是能够将数组$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 ] }

$in搜索 [2,3] 会得到匹配的文档:

> 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
}
于 2012-09-08T04:46:38.713 回答
0

简短的回答:这是不可能的。

于 2012-09-08T03:53:19.303 回答