i have collection has 3 documents below:
collection: { name: "a", arr: [1, 2, 3], arr1: [4, 5, 6] }, { name: "b", arr: [3, 7, 11], arr1: [5, 6, 9] }, { name: "c", arr: [3, 4, 5], arr1: [7, 9, 12] }
i want search array below in collection.
array values must matched in fields "arr" or "arr1".
mean array values can in either fields values must in document.
when search array in collection second has name:"b" , third has name:"c" documents should result.
because in second document; first array value( 3 ) in "arr" field , second , third array values(5 , 9) in "arr1" field. in third document first , second (3, 5) array values in "arr" field , third array value (9) in "arr1" field.
array : [3, 5, 9]
can me?
the best way using $redact
operator.
db.collection.aggregate([ { "$redact": { "$cond": [ { "$setissubset": [ [3,5,9], { "$setunion": [ "$arr", "$arr1" ] } ] }, "$$keep", "$$prune" ]} } ])
you can use $project
$setunion
operator , $match
.
db.collection.aggregate([ { "$project": { "name": 1, "arr": 1, "arr1": 1, "allvalues": { "$setunion": [ "$arr", "$arr1" ]}}}, { "$match": { "allvalues": { "$all": [3, 5, 9] }}} ])
output:
{ "_id" : objectid("55d48fd2939d0f7d372d6dbe"), "name" : "b", "arr" : [ 3, 7, 11 ], "arr1" : [ 5, 6, 9 ] } { "_id" : objectid("55d48fd2939d0f7d372d6dbf"), "name" : "c", "arr" : [ 3, 4, 5 ], "arr1" : [ 7, 9, 12 ] }
Comments
Post a Comment