powiedzmy mamy następujące dokumenty w naszej kolekcji:
{ "_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 ] }
i następującą tablicę wejściowych i n = 2
var inputArray = [1, 3, 0];
Możemy zwrócić te dokumenty, w których pole tablicy zawiera co najmniej n elementów danej tablicy przy użyciu struktury agregacji.
Urządzenie $match
wybiera tylko te dokumenty, które mają większą długość tablicy lub są równe n
. Zmniejsza to ilość danych do przetworzenia w dół w potoku.
$redact
operator rurociągu użyć logicznego przetwarzania warunku pomocą operatora $cond
i operacje specjalne $$KEEP
aby „zachować” dokument, w którym warunek logiczny jest prawdziwy lub $$PRUNE
do „wyrzucić” dokument gdzie warunek jest fałszywy.
W naszym przypadku, warunek jest $gte
która zwraca true jeśli $size
skrzyżowania dwóch tablic, które możemy obliczyć za pomocą operatora $setIntersection
jest większa lub równa 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
która produkuje:
{ "_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 ] }
struktura Pokaż db i co yo próbowałem tak daleko, aby to działało. – Shrabanee
Nie sądzę, że pytanie jest wystarczająco jasne, że nie muszę podawać struktury db. Nie jestem pewien, czy mongodb zapewnia takie wywołanie API, więc po prostu myślę o iteracji przez wszystkie dokumenty ... Oczywiście, brzmi naprawdę źle –
Czy elementy 'myArray' i' wordsCollection' są unikatowe? – Redu