基本上就是标题所说的。
输入:myArray
= 单词数组
我有一个有字段的模型
wordsCollection
,这是一个数组字段。
如何找到该模型的所有文档,其 wordsCollections
至少有 n 个 myArray
最佳答案
假设我们的集合中有以下文档:
{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d03"), "a" : [ 0, 8, 432, 9, 34, -3 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }
和下面的输入数组和n = 2
var inputArray = [1, 3, 0];
我们可以使用聚合框架返回数组字段包含给定数组的至少 n 个元素的那些文档。
$match
只选择数组长度大于或等于 n
的文档。这减少了管道中要处理的数据量。
$redact
管道运算符使用逻辑条件处理,使用 $cond
运算符和特殊操作 $$KEEP
来“保留”逻辑条件为真的文档或 $$PRUNE
来“丢弃”条件为假的文档。
在我们的例子中,条件是 $gte
,如果我们使用 $size
运算符计算的两个数组的交集的 $setIntersection
大于或等于 2
,则返回 true。
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
产生:
{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }
关于mongodb - 查找其数组字段包含给定数组的至少 n 个元素的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725694/