MongoDB选择在_id数组中的where子句如何实现?
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。
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数组进行查询的问题。
问题: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值的数量。