Mongodb:如何以与数组元素相同的顺序命令“select in”

时间:2012-10-02 15:36:37

标签: node.js mongodb

我正在执行此mongo查询:

db.mytable.find({id:{$in:["1","2", "3", "4" ]}});

它以奇怪的顺序返回所有结果,如下所示:

4,3,2,1

我需要以与查询数组中定义的顺序相同的顺序检索所有结果。

1,2,3,4

有可能吗?

3 个答案:

答案 0 :(得分:1)

你可以这样写一个查询:

db.mytable.find({id:{$in:["1","2", "3", "4" ]}}).sort({id:1})

获得结果ORDER BY id ASC

来源:MongoDB Advanced Queries

但是如果您只想根据$ in数组来排序结果,请尝试按相反顺序对$ in数组进行排序,有关$ in数组中第一个元素的结果可能会显示为最后一个结果的要素

答案 1 :(得分:1)

有几点需要注意:

1。)MongoDB与大多数数据库一样,不保证查询返回的结果顺序,除非您使用sort()调用。如果您确实希望保证以特定顺序返回查询结果,则需要指定该特定排序顺序。

2。)通常,最近更新/移动的文档将显示在结果集的末尾,但仍然没有保证。 MongoDB使用“自然顺序”作为对象的本机排序,虽然这非常接近插入顺序,但不能保证它们是相同的。

3.)索引字段的行为会有所不同。值得指出的是,您的查询似乎使用id而不是_id。默认情况下,前者_id将被编入索引,除非您已明确向该字段添加索引,否则id不会被编入索引。

您可以在此处阅读有关MongoDB排序和排序的更多信息: http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

答案 2 :(得分:0)

确实无法保证从查询返回的结果的顺序,但您可以在之后对结果进行排序。两个例子,第一个是你想要的顺序,第二个是相反的。

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 }}).map(i => result.find(j => j._id == i))(注意两个等号而不是三个)