【问题标题】:How to find all documents where the value of a field is null or empty如何查找字段值为空或为空的所有文档
【发布时间】:2016-04-15 10:38:38
【问题描述】:

我正在尝试编写一个简单的 Mongo 查询来返回字段值为 null 的所有文档(或一个空数组,我不确定你怎么称呼它)。

这是我的查询;

db.getCollection('contact').find({'poco.name.email':false})

这是我使用 RoboMongo 收集的截图;

最终,我需要将其转移到一些 PHP 中。到目前为止,我已经完成了这项工作;

$conditions = array_merge($conditions, [
  'owner.$id' => $this->getId(),
  'poco.name.familyName' => "Smith",
  //not sure what goes here.. something like
  //'poco.emails' => null,
]);

return Model_Mongo_Contact::getContacts($conditions, $sort, $fields, $limit, $skip); 

如果没有更多的方法访问权限,这可能会更难回答。或者我可能不是 Mongo 的新手,这可能真的很明显。

【问题讨论】:

  • @Rajesh 虽然$exists 在这里使用是正确的,但有一个特定的用法实际上会检测“两者”一个空数组以及任何不是数组或不存在的东西。成为"poco.email.0": { "$exists": false },您可以在其中查找存在的0 索引位置。作为true 条件,数组存在且“非空”,因此false 自然给出相反的结果。这就是这里给出的一个答案所解释的。

标签: php mongodb mongodb-query


【解决方案1】:

我不是 PHP 专家,但我将在 mongo shell 中执行以下操作:

db.collection.find({
  $and: [
    {"poco.email":{$exists: true}}, 
    {"poco.email":{$ne: []}}
  ]})

上面的查询将列出所有poco.name.email 不丢失且不为空的文档。

【讨论】:

    【解决方案2】:

    查找“空”数组甚至“不存在”数组时的基本概念是使用“点符号”的属性并搜索数组的0 索引不存在的位置。这可以通过使用$exists 运算符来实现:

    $conditions = array_merge($conditions, [
      'owner.$id' => $this->getId(),
      'poco.name.familyName' => "Smith",
      'poco.emails.0' => array( '$exists' => FALSE )
    ]);
    

    如果根本没有属性,或者它不是数组(因此没有 "0" 字段属性)或确实是“空”数组(因为一开始没有内容),则该条件为真索引)。

    当字段实际被“索引”时,这最有效。因此,如果在您的“正常”结构中,数组元素中有“子文档”,其中有一个名为"address" 的一致字段,其索引为"poco.emails.address",那么您最好指向该特定索引属性以查看是否$exists 与否:

    $conditions = array_merge($conditions, [
      'owner.$id' => $this->getId(),
      'poco.name.familyName' => "Smith",
      'poco.emails.0.address' => array( '$exists' => FALSE )
    ]);
    

    但如果数组只包含“值”而没有“子文档”,那么只需测试最初演示的数组的0 索引位置就足够了。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2016-08-17
      相关资源
      最近更新 更多