在此question中,Jeff the Bear解释了如何使用数组
搜索文档contains 'tag1'
contains ['tag1','tag2'],
contains any of ['tag3', 'tag4']
但是,如果我想搜索带有另一个数组一部分的数组的文档,我该怎么办?
post1.tags = ['tag1']
post2.tags = ['tag1','tag3']
post3.tags = ['tag2','tag4']
post4.tags = ['tag1','tag2','tag3','tag4']
我想获得post1和post3,因为它们有标签
contained in ['tag1', 'tag2', 'tag4']
我不想获得post2和post4,因为['tag1', 'tag2', 'tag4']
换句话说,选择其标签数组中的所有元素都可以在另一个条件数组中找到的帖子
答案 0 :(得分:3)
您可以使用聚合框架来执行此操作。鉴于以下数据
> db.post.find()
{ "_id" : 1, "tags" : [ "tag1" ] }
{ "_id" : 2, "tags" : [ "tag1", "tag3" ] }
{ "_id" : 3, "tags" : [ "tag2", "tag4" ] }
{ "_id" : 4, "tags" : [ "tag1", "tag2", "tag3", "tag4" ] }
聚合查询
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
}
})
会给你
{
"result": [{
"_id": 3,
"tags": [
"tag4",
"tag2"
]
}, {
"_id": 1,
"tags": [
"tag1"
]
}
],
"ok": 1
}
答案 1 :(得分:1)
7年后... 我基于this主题找到了这种解决方案。
从性能角度来看,我不确定这是否是一个好的解决方案,但它看起来比公认的解决方案还干净。
db.collection.find({
tags: {
"$not": {
"$elemMatch": {
"$nin": [
"tag1",
"tag2",
"tag4"
]
}
}
}
})
答案 2 :(得分:0)
我有一个类似的任务,什么对我有用:
db.collection.find({标签:{“ $ all”:[tag1“,tag2”,“ tag4”]}})
也许对某人有帮助 在文档https://docs.mongodb.com/manual/tutorial/query-arrays/#specify-multiple-criteria-for-array-elements
中建立的解决方案