首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb检查有一个嵌套属性的元素

mongodb检查有一个嵌套属性的元素
EN

Stack Overflow用户
提问于 2013-08-21 14:25:43
回答 2查看 1.7K关注 0票数 1

我收集了像这样的文件

代码语言:javascript
复制
[
{ "name": "pika", "attrs": { "A": 1, "B": 2 ...  } },
{ "name": "chu", "attrs": { "C": 3 } },
{ "name": "plop", "attrs": { "A": 1, "C": 3 } }
]

我想删除使用MongoDB2.4的记录中只有"C“和"C”属性的记录。attrs键下的可能属性的数量可能很大(> 100)。

我可以使用几个查询。

你会怎么做?

编辑:我想在包含其他属性的行中保持attr C。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-21 15:05:37

你有两个选择。如果你的关键空间很小,你可以做。

代码语言:javascript
复制
db.collection.remove( {C : {$exists:true}, A: {$exists:false}, B: {$exists: false} })

否则你就得做

代码语言:javascript
复制
var col = db.collection.find( {C : {$exists:true}} );
for(doc in col) {
    var found = false
    for(key in obj) {
        if( key !== 'C' ) {
            found = true;
            break;
        }
    }
    if(found === false) {
        db.collection.remove(doc);
    }
}

在MongoDB中无法直接计算文档中的键数,也无法在键名中查询通配符(例如,不能执行"key不等于C:{$exists: false}")。因此,您需要显式地测试所有键,或者测试应用程序层中的每个文档。

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 08:14:14

如果"attrs“是一个数组,换句话说,您的集合如下:

代码语言:javascript
复制
{ "name": "pika", "attrs": [{ "A": 1}, {"B": 2}] };
{ "name": "chu", "attrs": [{ "C": 3 }] };
{ "name": "plop", "attrs": [{ "A": 1}, {"C": 3 }] }

然后,您可以编写如下所示的查询,以找到所需的特定记录:

代码语言:javascript
复制
db.entities.find({"attrs.C": {$exists: true}, "attrs": {$size: 1}});

您可以在mongodb网站上查找$size操作,http://docs.mongodb.org/manual/reference/operator/size/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档