按数组类型查询 - MongoDB

时间:2015-12-09 16:18:13

标签: mongodb mongodb-query

我必须按类型查询我的mongoDB集合 假设我有 hello 集合的这两个文档:

db.hello.find({hobbies: {$type: 4 }})

现在,如果我按数组类型查询:

$tmp = json_decode(file_get_contents('https://apis.live.net/v5.0/me?access_token='.$accesstoken),true);

echo $tmp['first_name']; // OK (not an accesstoken problem)

输出中没有任何文件。如您所见,here 4是数组类型的数量。

4 个答案:

答案 0 :(得分:2)

根据the docs,您需要使用where子句:

db.hello.find( { $where : "Array.isArray(this.hobbies)" } );

答案 1 :(得分:2)

您需要使用where子句。请参阅以下语法:
db.hello.find( { $where : "Array.isArray(this.hobbies)" } );

答案 2 :(得分:2)

这是预期的行为。您只需使用"dot notation"$exists运算符

执行此操作即可
db.hello.find({ 'hobbies.0': { '$exists': true } } )

另一种方法是使用聚合和MongoDB 3.2中提供的$isArray运算符。但效率较低,因为$redact进行了集合扫描。

 db.hello.aggregate([ 
    { "$redact": { 
        "$cond": [
             { $isArray: "$hobbies" }, 
             "$$KEEP", 
             "$$PRUNE" 
        ]
    }}
])

答案 3 :(得分:1)

查看https://docs.mongodb.org/v3.0/reference/operator/query/type/#arrays

  

<强>阵列

     

当应用于数组时,$type匹配任何内部元素   指定的类型。没有投影,这意味着整个阵列   如果任何元素具有正确的类型,则匹配。随着投影,   结果将仅包括所请求类型的那些元素。

当您在hobbies字段上查询时,查询实际上会尝试匹配字段字段中的元素,因为它是一个数组。 所以你可以这样做:

db.hello.find({ $where: 'Array.isArray(this.hobbies)' });

但它不会非常有效并且不会使用索引。