Let dire che abbiamo i seguenti documenti in nostra collezione:
{ "_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 ] }
e la seguente matrice di ingresso e n = 2
var inputArray = [1, 3, 0];
Possiamo restituire quei documenti in cui il campo dell'array contiene almeno n elementi di un dato array usando la struttura di aggregazione.
Il $match
seleziona solo quei documenti con lunghezza della matrice maggiore o uguale a n
. Ciò riduce la quantità di dati da elaborare in fondo alla pipeline.
Il $redact
operatore pipeline utilizzano un'elaborazione condizione logica usando l'operatore $cond
e le operazioni speciali $$KEEP
a "mantenere" il documento in cui la condizione logica è vera o $$PRUNE
a "disfarsi" del documento in cui la condizione è falsa.
Nel nostro caso, la condizione è $gte
che restituisce vero se la $size
dell'intersezione delle due matrici che calcoliamo usando l'operatore $setIntersection
è maggiore o uguale 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
che produce:
{ "_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 ] }
struttura Visualizza db e quali anni hanno cercato finora di farlo funzionare. – Shrabanee
Non penso che la domanda sia abbastanza chiara che non ho bisogno di fornire la struttura db. Non sono sicuro che mongodb fornisca una tale chiamata API, quindi sto solo pensando di iterare attraverso tutti i documenti .... Ovviamente, suona davvero male –
Gli elementi di 'myArray' e' wordsCollection' sono unici? – Redu