【问题标题】:MongoDB select where in array of _id?MongoDB选择_id数组的位置?
【发布时间】:2011-12-04 12:42:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript arrays node.js mongodb express


    【解决方案1】:

    简单:)

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

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

    【讨论】:

    • 我们还能从索引中获益吗?在这种情况下,ID 作为纯字符串传递...
    • 你会的。然而,时间复杂度是线性的 (n),而不是对数/常数。如果没有索引,它将是 n^2。
    • 不是O(log(n) * m),其中n是集合的大小,m是传递的id数量吗?
    • 你必须使用 ObjectId 函数,如果 "_id" 是 ID 对象 — {_id: {$in: [ObjectId("5a633609670aeb6f93b88b23")]}}
    【解决方案2】:

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

    var list = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"]
    
        .find({ _id: {$in : list}})
    

    【讨论】:

    • 代码不工作。似乎必须将 ID 设置为 ObjectId("5883d387971bb840b7399130")
    • 我们如何以编程方式将它们设置为 ObjectIds?我在其中一个答案中尝试了@klipmode 建议的方法,但这不起作用。
    【解决方案3】:

    因为 mongodb 使用 bson 而对于 bson 来说是重要的属性类型。因为_idObjectId 你必须这样使用:

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

    mongodb compass 中这样使用:

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

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

    【讨论】:

      【解决方案4】:

      如果您想按用户和其他字段(例如有条件地)查找,您可以使用 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),
                    },
                  },
              
      

      【讨论】:

        【解决方案5】:

        你可以试试这个

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-21
          • 2012-04-08
          • 2014-05-31
          • 1970-01-01
          • 2022-11-30
          相关资源
          最近更新 更多