Arrays 对象MongoDb的排序数组和数组

Arrays 对象MongoDb的排序数组和数组,arrays,mongodb,sorting,Arrays,Mongodb,Sorting,我在MongoDB中有一个用于理解排序的简单集合 我的文件是: { "_id" : ObjectId("54b94985d74d670613e4fd35"), "tag" : [ "A", "B", "Z" ] } { "_id" : ObjectId("54b949c9d74d670613e4fd36"), "tag" : [ "D", "E",

我在MongoDB中有一个用于理解排序的简单集合

我的文件是:

{
    "_id" : ObjectId("54b94985d74d670613e4fd35"),
    "tag" : [ 
        "A", 
        "B", 
        "Z"
    ]
}

{
    "_id" : ObjectId("54b949c9d74d670613e4fd36"),
    "tag" : [ 
        "D", 
        "E", 
        "F"
    ]
}

{
    "_id" : ObjectId("54b949dfd74d670613e4fd37"),
    "tag" : [ 
        "G", 
        "H", 
        "I"
    ]
}
当我按标签排序时,我得到了这些结果

db.candy.find().sort({tag:1})


{
    "_id" : ObjectId("54b94985d74d670613e4fd35"),
    "tag" : [ 
        "A", 
        "B", 
        "Z"
    ]
}

{
    "_id" : ObjectId("54b949c9d74d670613e4fd36"),
    "tag" : [ 
        "D", 
        "E", 
        "F"
    ]
}

{
    "_id" : ObjectId("54b949dfd74d670613e4fd37"),
    "tag" : [ 
        "G", 
        "H", 
        "I"
    ]
}
改为使用标记:-1

db.candy.find().sort({tag:-1})

{
    "_id" : ObjectId("54b94985d74d670613e4fd35"),
    "tag" : [ 
        "A", 
        "B", 
        "Z"
    ]
}

{
    "_id" : ObjectId("54b949dfd74d670613e4fd37"),
    "tag" : [ 
        "G", 
        "H", 
        "I"
    ]
}

{
    "_id" : ObjectId("54b949c9d74d670613e4fd36"),
    "tag" : [ 
        "D", 
        "E", 
        "F"
    ]
}
结果非常相似,第一个物体是一样的,只改变了第二个和第三个。 对象数组的结果相同。 我的问题是: 它是如何工作的? 我知道字母A是字母(ASCII码)的第一个字母,Z是最后一个字母。 mongo检查数组的每个元素(或对象)? 当我使用tag:-1和tag:1时,为什么数组内部的顺序是相同的?我期待类似的事情

标签:1

和标签:-1

{
    "_id" : ObjectId("54b94985d74d670613e4fd35"),
    "tag" : [ 
        "Z", 
        "A", 
        "B"
    ]
}

排序运算符按数组字段排序文档时,执行以下操作:

  • 降序排序时,它从每个数组中提取最大的元素,并与其他数组进行比较

  • 升序排序时,它从每个数组中提取最小的元素,并与其他数组进行比较

  • 它们仅用于对文档进行排序,因此文档内部的顺序是相同的

    对于数组,小于比较或升序排序比较 数组的最小元素,且大于比较或 降序排序比较数组中最大的元素。像这样的 比较值为单个元素数组的字段时(例如[1 ])对于非数组字段(例如2),比较在1和2之间。 空数组的比较(例如[])将空数组视为 小于null或缺少字段


    只是重复并详细说明@marcinn,回答

    当发出下面的语句时,它要求
    mongodb
    对通过传递到
    find()
    语句的查询找到的文档进行
    sort
    排序,在这种情况下,
    find()
    函数将通过
    标记
    字段返回集合中的所有文档

    这里需要注意的一点是,字段
    标记
    的类型是
    数组
    ,而不是简单的字段

    如果它是一个简单的字段,文档将按照
    标记中的值进行排序

    无论如何,mongodb需要一个值来对文档进行排序。要获取字段的值,mongodb执行以下操作:

    • 检查
      标记
      是否为数组。如果是数组,则需要选择一个 数组中的元素,其值可以假定为 特定文件
    • 现在它检查指定的排序是升序还是降序 秩序
    • 如果按升序排列,则会在标记中找到最小的元素 数组,否则最大
    • 对于从标记数组中选择的元素,对于每个文档 应用排序
    这里需要注意的一点是,排序操作只会更改所检索的文档的顺序,换句话说,它就像
    SQL
    术语中的
    order by
    子句一样

    它不会更改每个文档的标记数组元素的顺序

    根据经验,链接了
    限制
    排序
    操作的
    find()
    查询不会更改检索到的文档的结构。要操作文档的结构,需要执行聚合操作

    您对问题的期望是通过操纵每个文档中的字段来实现的,这只有聚合操作才能做到

    所以如果你把它加起来

    db.candy.aggregate([
    {$match:{"_id":ObjectId("54b94985d74d670613e4fd35")}},
    {$unwind:"$tag"},
    {$sort:{"tag":-1}},
    {$group:{"_id":"$_id","tag":{$push:"$tag"}}}
    ])
    
    然后您可以得到以下结果:

    {
        "_id" : ObjectId("54b94985d74d670613e4fd35"),
        "tag" : [ 
            "Z", 
            "A", 
            "B"
        ]
    }
    
    非常感谢,在这种情况下,如果我这样做:
    db.coll.find().sort({“post”:1})
    db.coll.find().sort({“post.tag”:1})
    我会得到同样的结果。与
    post
    post.tag
    有什么不同?
    db.candy.aggregate([
    {$match:{"_id":ObjectId("54b94985d74d670613e4fd35")}},
    {$unwind:"$tag"},
    {$sort:{"tag":-1}},
    {$group:{"_id":"$_id","tag":{$push:"$tag"}}}
    ])
    
    {
        "_id" : ObjectId("54b94985d74d670613e4fd35"),
        "tag" : [ 
            "Z", 
            "A", 
            "B"
        ]
    }