在这个问题中,Jeff the Bear 解释了如何使用数组搜索文档
contains 'tag1'
contains ['tag1','tag2'],
contains any of ['tag3', 'tag4']
Run Code Online (Sandbox Code Playgroud)
但是,如果我想使用属于另一个数组的数组搜索文档,我该怎么办?
post1.tags = ['tag1']
post2.tags = ['tag1','tag3']
post3.tags = ['tag2','tag4']
post4.tags = ['tag1','tag2','tag3','tag4']
Run Code Online (Sandbox Code Playgroud)
我想得到 post1 和 post3 因为它们有标签
contained in ['tag1', 'tag2', 'tag4']
Run Code Online (Sandbox Code Playgroud)
我不想得到 post2 和 post4,因为 tag3 不存在于 ['tag1', 'tag2', 'tag4']
换句话说,选择帖子标签数组中的所有元素都可以在另一个条件数组中找到
7年后......我根据这个主题找到了这个解决方案。
我不确定这在性能方面是否是一个好的解决方案,但它看起来比公认的解决方案更干净。
db.collection.find({
tags: {
"$not": {
"$elemMatch": {
"$nin": [
"tag1",
"tag2",
"tag4"
]
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
您可以使用聚合框架来执行此操作。鉴于以下数据
> db.post.find()
{ "_id" : 1, "tags" : [ "tag1" ] }
{ "_id" : 2, "tags" : [ "tag1", "tag3" ] }
{ "_id" : 3, "tags" : [ "tag2", "tag4" ] }
{ "_id" : 4, "tags" : [ "tag1", "tag2", "tag3", "tag4" ] }
Run Code Online (Sandbox Code Playgroud)
聚合查询
db.post.aggregate({
$project: {
_id: 1,
tags: 1,
killFlag: {
$const: [true, false]
}
}
}, {
$unwind: "$tags"
}, {
$unwind: "$killFlag"
}, {
$match: {
$nor: [{
tags: {
$in: ['tag1', 'tag2', 'tag4']
},
killFlag: true
}
]
}
}, {
$group: {
_id: "$_id",
tags: {
$addToSet: "$tags"
},
killFlag: {
$max: "$killFlag"
}
}
}, {
$match: {
killFlag: false
}
}, {
$project: {
_id: 1,
tags: 1
}
})
Run Code Online (Sandbox Code Playgroud)
会给你
{
"result": [{
"_id": 3,
"tags": [
"tag4",
"tag2"
]
}, {
"_id": 1,
"tags": [
"tag1"
]
}
],
"ok": 1
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4326 次 |
| 最近记录: |