假设我插入了一组文档,每个文档都有一个array字段.我想找到所有文档,使其array字段是查询数组的子集.例如,如果我有以下文件,
collection.insert([
{
'name': 'one',
'array': ['a', 'b', 'c']
},
{
'name': 'two',
'array': ['b', 'c', 'd']
},
{
'name': 'three',
'array': ['b', 'c']
}
])
Run Code Online (Sandbox Code Playgroud)
我询问collection.find({'array': {'$superset': ['a', 'b', 'c']}),我希望看到的文件one,并three为['a', 'b', 'c']和['b', 'c']的两个子集['a', 'b', 'c'].换句话说,我想要做的蒙戈的逆$all查询,它选择所有文件使得查询阵列是文档的子集array场.这可能吗?如果是的话,怎么样?
使用聚合框架或查找查询有一种简单的方法.
查找查询很简单,但您必须使用$ elemMatch运算符:
> db.collection.find({array:{$not:{$elemMatch:{$nin:['a','b','c']}}}}, {_id:0,name:1})
Run Code Online (Sandbox Code Playgroud)
注意,这表明我们想要不匹配具有(同时)不等于'a','b'或'c'的元素的数组.我添加了一个投影,它只返回结果文档的名称字段,这是可选的.
在MongoDb中,对于数组字段:
"$in:[...]" means "intersection" or "any element in",
"$all:[...]" means "subset" or "contain",
"$elemMatch:{...}" means "any element match"
"$not:{$elemMatch:{$nin:[...]}}" means "superset" or "in"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1907 次 |
| 最近记录: |