Arrays 对象MongoDb的排序数组和数组
我在MongoDB中有一个用于理解排序的简单集合 我的文件是:Arrays 对象MongoDb的排序数组和数组,arrays,mongodb,sorting,Arrays,Mongodb,Sorting,我在MongoDB中有一个用于理解排序的简单集合 我的文件是: { "_id" : ObjectId("54b94985d74d670613e4fd35"), "tag" : [ "A", "B", "Z" ] } { "_id" : ObjectId("54b949c9d74d670613e4fd36"), "tag" : [ "D", "E",
{
"_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"
]
}
排序运算符按数组字段排序文档时,执行以下操作:
只是重复并详细说明@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"
]
}