如何在mongodb中找到空文档?

时间:2018-02-25 19:58:05

标签: mongodb

我是mongodb的初学者。实际上,我试图找到所有包含null或者没有任何内容的文档,例如{ "_id" : "abc" }这样的文档,用于从集合中删除它们。

但即使在搜索了很多SO个问题之后,我也无法得到任何解决方案。那么,我该怎么做呢?对不起,如果我忽略了任何事情。

2 个答案:

答案 0 :(得分:3)

我不知道如何在一次操作中完成它,但你可以尝试这样的事情:

  @HostListener('window:resize', ['$event']) onResize(event) {
     console.log(event.target.innerWidth;);
  }

答案 1 :(得分:0)

一种可能的解决方案是获取这些空字段文档的_id值列表,然后将其删除。考虑到您只执行两个查询而不是循环遍历整个集合,这可能会非常有效(这可能会影响您的数据库性能,尤其是对于大型集合)。

考虑运行以下聚合管道来获取这些ID:

var ids = db.collection.aggregate([
    { "$project": {
        "hashmaps": { "$objectToArray": "$$ROOT" } 
    } }, 
    { "$project": {
        "keys": "$hashmaps.k"
    } },
    { "$redact": {
            "$cond": [
                {
                    "$eq":[
                        {
                            "$ifNull": [
                                { "$arrayElemAt": ["$keys", 1] },
                                0
                            ]
                        },
                        0
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
    } },
    { "$group": {
        "_id": null,
        "ids": { "$push": "$_id" }
    } }
]).toArray()[0]["ids"];

删除文件

db.collection.remove({ "_id": { "$in": ids } });

另一种方法类似于上面的方法,因为你需要两个查询;第一个返回集合中所有顶级字段的列表,最后一个删除集合中没有这些字段的文档。

考虑运行以下查询:

/* 
   Run an aggregate pipeline operation to get a list 
   of all the top-level fields in the collection
*/
var fields = db.collection.aggregate([
    { "$project": {
       "hashmaps": { "$objectToArray": "$$ROOT" } 
    } }, 
    { "$project": {
       "keys": "$hashmaps.k"
    } },
    { "$group": {
        "_id": null,
        "fields": { "$addToSet": "$keys" }
    } },
    { "$project": {
            "fields": {
                "$setDifference": [
                    {
                        "$reduce": {
                            "input": "$fields",
                            "initialValue": [],
                            "in": { "$setUnion" : ["$$value", "$$this"] }
                        }
                    },
                    ["_id"]
                ]
            }
        }
    }
]).toArray()[0]["fields"];

第二个查询查找除_id之外的所有字段的存在。例如,假设您的收藏集包含包含_idabc键的文档,查询

db.collection.find({ 
    "a" : { "$exists": false },
    "b" : { "$exists": false },
    "c" : { "$exists": false }
}); 

匹配不包含所有三个字段的文档 a b AND c

因此,如果您的集合中包含顶级字段列表,那么您只需要构建上述查询文档。对数组使用reduce方法:

// Construct the above query
var query = fields.reduce(function(acc, curr) {
    acc[curr] = { "$exists": false };
    return acc;
}, {});

然后使用查询将文档删除为

db.collection.remove(query);