我正在执行这个 mongo 查询:
db.mytable.find({id:{$in:["1","2", "3", "4" ]}});
它以奇怪的顺序返回所有结果,如下所示:
4,3,2,1
我需要以与查询数组中定义的顺序相同的顺序检索所有结果。
1,2,3,4
是否可以 ?
确实不能保证查询返回的结果的顺序,但您可以在之后对结果进行排序。两个例子,第一个是你想要的顺序,第二个是相反的。
const arr = ["1", "2", "3", "4" ];
db.collection.find({ id: { $in: arr }})
.then(result => {
let sorted = arr.map(i => result.find(j => j.id === i));
console.log(sorted) // 1, 2, 3, 4
let reversed = arr.reverse().map(i => result.find(j => j.id === i));
console.log(reversed) // 4, 3, 2, 1
});
如果您想进行真正的 MongoDB ID 查找,请使用db.collection.find({ _id: { $in: arr }})
and .map(i => result.find(j => j._id == i))
(注意两个等号而不是三个)
你可以写一个这样的查询:
db.mytable.find({id:{$in:["1","2", "3", "4" ]}}).sort({id:1})
得到你的结果ORDER BY id ASC
来源:MongoDB 高级查询
但是,如果您只想根据 $in 数组对结果进行排序,请尝试以相反的顺序对 $in 数组进行排序,关于 $in 数组的第一个元素的结果可能会显示为结果
有几点需要注意:
1.) MongoDB 与大多数数据库一样,不保证查询返回的结果的顺序,除非您使用对sort()
. 如果您确实想保证查询结果以特定顺序返回,则需要指定该特定排序顺序。
2.) 通常,最近更新/移动的文档将显示在结果集的末尾,但仍然不能保证。MongoDB 使用“自然顺序”来对对象进行本机排序,尽管这非常接近插入顺序,但不能保证相同。
3.) 索引字段的行为会有所不同。值得指出的是,您的查询看起来像是 usingid
而不是_id
. 前者,_id
默认情况下id
会被索引,除非您明确地向该字段添加索引,否则不会被索引。
您可以在此处阅读有关 MongoDB 排序和排序的更多信息: http ://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order