UPDATE based on comments
Query:
let input = "buzz";
db.collectionName.find(
{
$or: [
{ $text: { $search: input } },
{ _id: { $exists: true } }
]
},
{
"foo": 1,
score: { $meta: "textScore" }
}
).sort({
score: { $meta: "textScore" }
});
IMPORTANT: You need to create text index as shown below:
db.collectionName.insertMany([
/* 1 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id": ObjectId("6036ba93e715d911e89e062b"),
"foo": "bar4",
"arr": ["buzz"]
},
/* 2 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id": ObjectId("6036ba93e715d911e89e062a"),
"foo": "bar3",
"arr": ["fizz"]
},
/* 3 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id": ObjectId("6036ba93e715d911e89e0629"),
"foo": "bar2"
},
/* 4 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id": ObjectId("6036ba93e715d911e89e0628"),
"foo": "bar1",
"arr": ["fizz", "buzz"]
}
]);
db.collectionName.createIndex({ arr: "text" });
Output:
/* 1 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0628"),
"foo" : "bar1",
"score" : 1.1
},
/* 2 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062b"),
"foo" : "bar4",
"score" : 1.1
},
/* 3 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0629"),
"foo" : "bar2"
},
/* 4 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062a"),
"foo" : "bar3"
}
Refer this link for some insights on textScore
.
OLD ANSWER
Try this:
let input = "buzz";
db.collectionName.aggregate([
{
$project: {
"foo": 1,
"sortArray": {
$size: {
$ifNull: [
{
$filter: {
input: "$arr",
as: "item",
cond: { $in: [input, "$arr"] }
}
},
[]
]
}
}
}
},
{
$sort: { sortArray: -1 }
}
]);
Output:
/* 1 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0628"),
"foo" : "bar1",
"sortArray" : 2
},
/* 2 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062b"),
"foo" : "bar4",
"sortArray" : 1
},
/* 3 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0629"),
"foo" : "bar2",
"sortArray" : 0
},
/* 4 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062a"),
"foo" : "bar3",
"sortArray" : 0
}
My test data looks like this:
/* 1 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062b"),
"foo" : "bar4",
"arr" : ["buzz"]
},
/* 2 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e062a"),
"foo" : "bar3",
"arr" : ["fizz"]
},
/* 3 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0629"),
"foo" : "bar2"
},
/* 4 createdAt:2/25/2021, 2:14:03 AM*/
{
"_id" : ObjectId("6036ba93e715d911e89e0628"),
"foo" : "bar1",
"arr" : ["fizz", "buzz"]
}