MongoDB选择在_id数组中的where子句如何实现?

24 浏览
0 Comments

MongoDB选择在_id数组中的where子句如何实现?

在MongoDB中,可以像在SQL中一样选择集合中的文档:

SELECT * FROM collection WHERE _id IN (1,2,3,4);

或者如果我有一个_id数组,我必须逐个选择然后重新组合结果的数组/对象吗?

0
0 Comments

MongoDB中的select where in array of _id出现的原因是因为MongoDB使用的是bson,并且对于bson来说,属性的类型非常重要。而由于_id是ObjectId类型,所以必须按照以下方式使用:

在命令行中使用如下代码:

db.collection.find( { _id : { $in : [ObjectId('1'),ObjectId('2')] } } );

在MongoDB Compass中使用如下代码:

{ "_id" : { $in : [ObjectId('1'),ObjectId('2')] } }

需要注意的是,字符串形式的objectId长度为24。

0
0 Comments

MongoDB的select where in array of _id问题出现的原因是在查询中需要根据一个_id的数组进行筛选,但是直接使用该数组会导致查询失败。解决方法是将数组中的每个_id转换为ObjectID对象,然后使用$in操作符进行查询。

具体的解决方法如下:

var ids = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"];
var oids = [];
ids.forEach(function(item){
    oids.push(new ObjectId(item));
});
.find({ _id: {$in : oids}})

需要注意的是,在使用上述方法之前,需要先定义ObjectID,如下所示:

var ObjectId = require('mongodb').ObjectID;

通过以上方法,可以解决在MongoDB中根据_id数组进行查询的问题。

0
0 Comments

问题:MongoDB中如何使用$in操作符查询_id在数组中的文档?

原因:在使用$in操作符查询_id在数组中的文档时,虽然可以直接传入字符串形式的_id值,但是这样会导致时间复杂度变为线性(n),而不是对数/常数级别。如果没有索引,时间复杂度将变为n^2。

解决方法:为了获得更好的性能,可以使用ObjectId函数将_id值转换为ObjectId类型,然后再进行查询。具体代码如下:

db.collection.find({ _id: { $in: [ObjectId("5a633609670aeb6f93b88b23")] } })

这样可以保持索引的使用,时间复杂度为O(log(n) * m),其中n是集合的大小,m是传入的_id值的数量。

0