我是mongodb的初学者。实际上,我试图找到所有包含null或者没有任何内容的文档,例如{
"_id" : "abc"
}
这样的文档,用于从集合中删除它们。
但即使在搜索了很多SO
个问题之后,我也无法得到任何解决方案。那么,我该怎么做呢?对不起,如果我忽略了任何事情。
答案 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
之外的所有字段的存在。例如,假设您的收藏集包含包含_id
,a
,b
和c
键的文档,查询
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);