MongoDB 选择_id 数组中的位置?

IT技术 javascript arrays node.js mongodb express
2021-02-25 03:27:13

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

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

或者如果我有一个_id array我必须一一选择然后重新组合array/object结果?

5个回答

简单 :)

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

取自:http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

这难道不是O(log(n) * m)在那里n是集合的大小,m是通过ID的数量?
2021-04-17 03:27:13
你必须使用 ObjectId 函数,如果 "_id" 是 ID 对象 — {_id: {$in: [ObjectId("5a633609670aeb6f93b88b23")]}}
2021-04-17 03:27:13
我们还能从索引中获益吗?在这种情况下,ID 作为纯字符串传递...
2021-04-25 03:27:13
你做。然而,时间复杂度是线性的(n),而不是对数/常数。如果没有索引,它将是 n^2。
2021-05-02 03:27:13

因为mongodb 使用bsonand for bson 是重要的属性类型。因为_idObjectId你必须使用这样的:

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

mongodb compass像这样使用:

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

注意:字符串中的 objectId 有24长度。

list 是一个 id 数组

在此代码列表中是用户集合中的 id 数组

var list = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"]

    .find({ _id: {$in : list}})
该代码不起作用。似乎必须将 ID 设置为 ObjectId("5883d387971bb840b7399130")
2021-04-28 03:27:13
我们如何以编程方式将它们设置为 ObjectIds?我在其中一个答案中尝试了@klipmode 建议的方法,但这不起作用。
2021-05-01 03:27:13

你可以试试这个

var ids = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"];

var oids = [];
ids.forEach(function(item){
oids.push(new ObjectId(item));
});

.find({ _id: {$in : oids}})

如果您想按用户以及有条件地按另一个字段查找,您可以使用扩展和三元运算符轻松地像下面那样使用aggregatematch

 const p_id = patient_id;
    let fetchingReports = await Reports.aggregate([
      ...(p_id
        ? [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
                patient_id: p_id,
              },
            },
          ]
        : [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
              },
            },