[英]How to count matched elements from an Array in another Array MongoDB
I am using the MongoDB Aggregate framework to query a users collection. 我正在使用MongoDB Aggregate框架来查询用户集合。
This is the is an example of the user schema layout below: 这是下面的用户架构布局的示例:
{
"_id" : ObjectId("XXXXXXXXXXXXXX367db"),
"updatedAt" : ISODate("2017-08-18T10:59:54.904Z"),
"createdAt" : ISODate("2017-08-18T10:59:54.904Z"),
"email" : "fake57@gmail.com",
"firstName" : "Tianna.",
"gender" : "male",
"geometry" : {
"coordinates" : [
-6.26119,
53.35247
],
"_id" : ObjectId("5996c8a9a4d84d3639c367dc"),
"type" : "point"
},
"age" : 25,
"personalAttributes" : [
"ksjdnksajdna",
"ksjdssacasca",
"xz12nksajdna",
"xz12nksaxxna",
"xz12nksaxxxx",
"xz12nwwzwwwa",
"xz12nkslkmna",
]
}
This is steps outlined in the aggregate pipeline. 这是聚合管道中概述的步骤。
1: Geolocate users within a specified distance using the $geoNear operator. 1:使用$ geoNear运算符在指定距离内定位用户。
2: Match the users based on gender. 2:根据性别匹配用户。
db.getCollection('users').aggregate([
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-6.26030969999999,
53.3498053
]
},
"distanceField": "dist.calculated",
"spherical": true,
"maxDistance": 770000
}
},
{
"$match": {
"gender": "male"
}
}
])
What I want to do is pass another users personalAttributes Array and count the number of matched items in each array .It would look something like this: 我想要做的是传递另一个用户的personalAttributes数组并计算每个数组中匹配项的数量。看起来像这样:
db.getCollection('users').aggregate([
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-6.26030969999999,
53.3498053
]
},
"distanceField": "dist.calculated",
"spherical": true,
"maxDistance": 770000
}
},
{
"$match": {
"gender": "male"
}
},
{
"$project": {
"_id": 1,
"gender": 1,
"firstName": 1,
"profileImage": 1
"personalAttributesMatches": {
//Pass in the users personalAttributes Array and count the number of matches and return all the data.
}
}
}
}
])
With the expected output to be 与预期的输出是
/* 1 */
{
"_id" : ObjectId("5996c8aaa4d84d3639c36a61"),
"firstName" : "Sharon",
"gender" : "male",
"personalAttributesMatches": 15
}
/* 2 */
{
"_id" : ObjectId("5996c9c41daf273658715fcf"),
"firstName" : "Hilton",
"gender" : "male",
"personalAttributesMatches": 11
}
/* 3 */
{
"_id" : ObjectId("5996c6d66f8910361b8232b5"),
"firstName" : "Eliezer",
"gender" : "male",
"personalAttributesMatches": 7
}
Insights into this would be much appreciated!! 对此的见解将不胜感激!!
You can make use of setIntersection expression, so your project stage can look like following: 您可以使用setIntersection表达式,因此您的项目阶段如下所示:
"$project": {
"_id": 1,
"gender": 1,
"firstName": 1,
"profileImage": 1,
"personalAttributesMatches": {
$size:{
$setIntersection: ["$personalAttributes", _other_persons_attributes_]
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.