MongoDB - 检查文档中某个字段的值是否存在

9

我有一个集合,其中文档如下所示:

/* 0 */

{
    "_id" : ObjectId("5320b1c723bc746084fa7107"),
    "channels" : [ 
        3, 
        4
    ]
}


/* 1 */

{
    "_id" : ObjectId("5320b1c723bc746084fa7107"),
    "channels" : [ ]
}

我希望能够查询所有channels字段有值且非空的文档。

我尝试了以下代码:

db.event_copy.find({"channels":{$exists:true}})

但这仍会返回没有通道值的文档。
4个回答

17
你需要使用$size运算符。如果想要查找没有元素的内容,请按照以下步骤操作。
db.collection.find({ channels: {$size: 0} })

如果您知道您有一个固定的大小,那么就使用它。
db.collection.find({ channels: {$size: 2} })

否则使用$not进行反转
db.collection.find({ channels: {$not:{$size: 0}} })

而且你可以与$and组合使用:

db.collection.find({ $and: [ 
    { channels: {$not:{$size: 0}} },
    { channels: {$exists: true } }
]})

是的,我刚刚尝试了$size运算符。问题是我想要所有具有某个值的文档。我不知道里面可能有多少个值。基本上我不知道大小。我尝试使用$gte和$size,但似乎不起作用。 - Pi Horse
@PiHorse 你不能使用范围,但是有一个条件可以实现。请查看编辑。 - Neil Lunn
由于某种原因,该查询未给出正确的结果。它还返回了那些没有通道字段本身的文档。 - Pi Horse
@PiHorse 当你提问时,需要明确类似的事情。请再次查看编辑。 - Neil Lunn
那个方案可以正常工作。但是看一下我发布的答案。那似乎是一个更简单的解决方案。不过不确定查询性能如何。 - Pi Horse
@PiHorse,点符号表示法很好,当一些文档甚至没有该字段时,这是首先想到的方法。 - Neil Lunn

4
我使用了这个:
db.event_copy.find({'channels.0' : {$exists: true}}).count()

1
它是否还检查字段是否具有值,还是仅检查字段是否存在? - Gobliins

1

查看大小运算符此处

db.event_copy.find( { channels: { $size: 0 } } );

是的,我刚刚尝试了$size运算符。问题是我想要所有具有某些值的文档。我不知道里面可能有多少个值。基本上我不知道大小。我尝试使用$gte和$size,但似乎不起作用。 - Pi Horse

0
from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client['my_database']
col=db['my_collection']

### Input
email="test@gmail.com"
########
exist_count=col.find({"email": email},{'_id':0}).count()

if exist_count>=1:
    print("Field value is present")
else:
    print("Field value is not present")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接