使用 MongoDB 检查字段是不是存在

Posted

技术标签:

【中文标题】使用 MongoDB 检查字段是不是存在【英文标题】:Check that Field Exists with MongoDB使用 MongoDB 检查字段是否存在 【发布时间】:2013-11-20 23:48:09 【问题描述】:

所以我正在尝试查找具有字段集且不为空的所有记录。

我尝试使用$exists,但是根据MongoDB documentation,,此查询将返回等于null的字段。

$exists 匹配包含存储空值字段的文档。

所以我现在假设我必须做这样的事情:

db.collection.find( "fieldToCheck" :  $exists : true, $not : null  )

然而,每当我尝试这个时,我都会收到错误[invalid use of $not] 任何人都知道如何查询这个?

【问题讨论】:

【参考方案1】:

使用$ne(表示“不等于”)

db.collection.find( "fieldToCheck":  $exists: true, $ne: null  )

【讨论】:

这会返回什么?一个空集合?单品?一个数组? @iLoveUnicorns:find 总是返回:符合条件的记录集合。 @SergioTulentsev AFAIK 它返回一个光标 @fernandohur:是的,但是如果您的文档少于一页,您甚至不会看到差异。而且,如果您要从外部驱动程序运行此查询,我敢肯定它们中的大多数会保护您免受游标实现细节的影响。【参考方案2】:

假设我们有一个如下的集合:

 
  "_id":"1234"
  "open":"Yes"
  "things":
             "paper":1234
             "bottle":"Available"
             "bottle_count":40
             

我们想知道瓶子字段是否存在?

回答:

db.products.find("things.bottle":"$exists":true)

【讨论】:

When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. From the docs. 是的,但我不明白为什么数据库会包含 null 值,这很草率【参考方案3】:

我发现这对我有用

db.getCollection('collectionName').findOne("fieldName" : $ne: null)

【讨论】:

【参考方案4】:
db.<COLLECTION NAME>.find( "<FIELD NAME>":  $exists: true, $ne: null  )

【讨论】:

【参考方案5】:

此评论写于2021,适用于MongoDB 5.X 及更早版本。

如果您重视 查询性能 永远不要使用 $exists(或仅当您对所查询的字段有稀疏索引时才使用它。稀疏索引应该匹配查询条件,意思是,如果搜索 $exists:true,稀疏索引应该超过 field:$exist:true ,如果你正在查询 where $exists:true 稀疏索引应该在 field:$exist:false

改为使用:

db.collection.find( "fieldToCheck":   $ne: null  )

db.collection.find( "fieldToCheck":   $eq: null  )

这将要求您将 fieldToCheck 包含在集合的每个文档中,但是 - 性能将大大提高。

【讨论】:

【参考方案6】:

我尝试将其转换为布尔条件,如果文档与 表名已经存在,那么它将附加在同一个文档中, 否则它会创建一个。

table_name 是我用来查找文档的变量

query =  table_name : "$exists": "True"
    
    result = collection.find(query)
    flag = 0
    for doc in result:
        collection.update_one(,  "$push" :  table_name : 'name':'hello'   )
        flag = 1
    if (flag == 0):
        collection.insert_one( table_name : 'roll no' : '20')

【讨论】:

【参考方案7】:

汇总示例

https://mongoplayground.net/p/edbKil4Zvwc

db.collection.aggregate([
  
    "$match": 
      "finishedAt": 
        "$exists": true
      
    
  ,
  
    "$unwind": "$tags"
  ,
  
    "$match": 
      "$or": [
        
          "tags.name": "Singapore"
        ,
        
          "tags.name": "ABC"
        
      ]
    
  ,
  
    "$group": 
      "_id": null,
      "count": 
        "$sum": 1
      
    
  
])

【讨论】:

以上是关于使用 MongoDB 检查字段是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 字段索引后,如何快速检查一个该字段的数值是不存在的

Mongodb检查数组的子文档中是否存在字段

Mongodb-查询json数组中的字段是不是存在

用PHP查询mongo数据时,条件是某个字段(A为数组)不为空,但是有的记录中并没有字段A,这个条件怎么写?

检查 DF 中是不是存在列 - Java Spark

mongodb 在节点中使用 mongoose 想要在查询中使用 or 和