检查MongoDB中是否存在字段

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

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

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

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

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

然而,每当我尝试这样做时,我都会得到错误[invalid use of $not]。有人知道如何查询吗?

195661 次浏览

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

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

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

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

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

答案:

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

我发现这对我有用。

db.getCollection('collectionName').findOne({"fieldName" : {$ne: null}})
db.<COLLECTION NAME>.find({ "<FIELD NAME>": { $exists: true, $ne: null } })

该注释以2021编写,并应用于适用于MongoDB 5.X及更早版本。

如果值查询性能永远不要使用$exists(或仅当查询字段上有稀疏索引时才使用它)。稀疏索引应与查询条件匹配,也就是说,如果搜索$exists:true,则稀疏索引应在字段:{$exist:true}上,如果查询$exists:true,则稀疏索引应在字段:{$exist:false}

而应使用:

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

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

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

我尝试将其转换为布尔条件,其中如果文档带有 表名已存在,则将追加到同一文档中。 否则它将创建一个。

表_名称是我试图用来查找文档的变量。

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'}})

聚合示例

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
}
}
}
])

在我的例子中,我将ABC_0_新字段添加到仅删除的字段中。

因此,对于所有其他记录,没有isDeleted字段,因此我想获取isDeleted的所有字段,这些字段要么不存在,要么为false.所以查询是

.find({ isDeleted: { $ne: true } });