【问题标题】:Count all the documents in MongoDB containing specific item in array计算 MongoDB 中包含数组中特定项目的所有文档
【发布时间】:2017-08-21 00:31:15
【问题描述】:

我对 MongoDB 非常陌生,我真的很想了解如何访问并计算我的数据库中我有“name1”(在名称数组中)的所有文档实例。我应该使用什么 - 聚合,查找?我尝试过但一直失败,无法真正找到合适的查询。我的文档示例如下。 我正在使用 PyMongo 作为连接驱动程序。

{  
   '_id':ObjectId('599983d47fec3323a8526d74'),
   'name':[  
      {  
         'name1':{  
            'params':[  
               {  
                  'a':'b'
               }
            ]
         },
         {  
            'name2':{  
               'params':[  
                  {  
                     'a':'b'
                  }
               ]
            }
         ]
      }

【问题讨论】:

  • 最好真的改变结构,但是.find({ "name.name1": { "$exists": true }).count() 确实有效,尽管没有使用索引,因为 MongoDB 在测试“键”而不是值时不能使用索引。像这样变化的命名键对于数据库来说从来都不是一个好主意。嵌套数组也不是一个好主意。

标签: python mongodb


【解决方案1】:

您的数据模型存在严重缺陷。永远不要将键用作值,因为这几乎总是会迫使您在代码中做一些奇怪的事情。

因此,一个更合适的数据模型应该是

{
   "_id": new ObjectId(),
   "names": [
     {
       "name": "name1",
        "params": {
           "a":"b",
           "foo":"bar"
         }
       }
     ]
   }

查询这个模型变得轻而易举

db.yourColl.find({"names.name":"name1"})

注意:将params 设为数组是没有意义的。您可以通过params 对象的对象属性访问各个参数。

【讨论】:

    【解决方案2】:

    您可以对特定字段使用$in 运算符并使用.count()。例如:

    db.COLLECTION.find({
        'names': {
            '$in': ['name1']
        }
    }).count()
    

    【讨论】:

    • 不需要$in 运算符。如果值是一个数组,一个简单的{"names":"name1"} 就足够了
    猜你喜欢
    • 2016-12-11
    • 2017-02-17
    • 1970-01-01
    • 2014-02-18
    • 2021-01-03
    • 1970-01-01
    • 2022-01-19
    • 2016-06-18
    相关资源
    最近更新 更多