In mongoDB, I am interested in determining the length of both the longest and shortest values for a field with a String data type.
My collection contains a total of 500,000 documents.
In mongoDB, I am interested in determining the length of both the longest and shortest values for a field with a String data type.
My collection contains a total of 500,000 documents.
Recent versions of MongoDB have introduced the $strLenBytes
and $strLenCP
aggregation operators, which allow for a simplified approach:
Class.collection.aggregate([
{ "$group" => {
"_id" => null,
"max" => { "$max" => { "$strLenCP" => "$a" } },
"min" => { "$min" => { "$strLenCP" => "$a" } }
}}
])
In this code snippet, replace "a"
with the string property in your document from which you want to retrieve the minimum and maximum lengths.
To obtain the minimum and maximum length values efficiently, one effective method is to utilize mapReduce along with specific optimization techniques.
Start by creating a mapper function that outputs a single item from your collection to reduce the workload:
map = Q%{
function () {
if (this.a.length < store[0])
store[0] = this.a.length;
if (this.a.length > store[1])
store[1] = this.a.length;
if (count == 0)
emit(null, 0);
count++;
}
}
Given that this operation mainly deals with a globally scoped variable retaining the min and max lengths, substitute it within a finalize
function on the emitted single document. Even though a reduce stage isn't required, define an empty function for consistency:
reduce = Q%{ function() {} }
finalize = Q%{
function(key,value) {
return {
min: store[0],
max: store[1]
};
}
}
Proceed by executing the mapReduce operation:
Class.map_reduce(map, reduce).out(inline: 1).finalize(finalize).scope(store: [], count: 0)
This process performs all computations on the server instead of iterating through results sent to the client application. For a small dataset like this:
{ "_id" : ObjectId("543e8ee7ddd272814f919472"), "a" : "this" }
{ "_id" : ObjectId("543e8eedddd272814f919473"), "a" : "something" }
{ "_id" : ObjectId("543e8ef6ddd272814f919474"), "a" : "other" }
The resulting output would be similar to the following (shell output, but essentially the same for the driver):
{
"results": [
{
"_id": null,
"value": {
"min": 4,
"max": 9
}
}
],
"timeMillis": 1,
"counts": {
"input": 3,
"emit": 1,
"reduce": 0,
"output": 1
},
"ok": 1
}
By leveraging mapReduce, JavaScript processing on the server can perform these calculations swiftly, thereby reducing network traffic. Currently, there are no other built-in methods for MongoDB to directly return string lengths, making JavaScript processing on the server essential.
To retrieve the longest value of a specific field:
db.entities.aggregate([{ $match:{ condition } },{
$addFields: {
"length": { $strLenCP: "$feildName" }
}},
{ "$sort": { "length": -1 } },
{$limit:1}
])
If you want to get the shortest value for a field, change { "$sort": { "length": -1 } } to { "$sort": { "length": 1 } }
To obtain the min and max values, you can utilize a mongo shell script. Keep in mind that this procedure will conduct a complete table scan.
function findMinAndMax() {
var maximum = 0;
var minimum = db.collection.findOne().fieldName.length;
db.collection.find().forEach(function(doc) {
var currentLen = doc.fieldName.length;
if (currentLen > maximum) {
maximum = currentLen;
}
if (currentLen < minimum) {
minimum = currentLen;
}
});
print(maximum);
print(minimum);
}
use <databaseName>
findMinAndMax();
You have the option to save the function in a file such as c:\findMinMax.js and execute it using the following command:
c:\mongodb\bin> mongo dbName < c:\findMinMax.js
Please remember: you might be required to input the essential hostname, username, and password to establish a connection with your database.
c:\mongodb\bin> mongo --host hostName --port portNum -u userName -p password dbName < c:\findMinMax.js
When it comes to data manipulation, the aggregation framework is generally considered the most effective method. However, there are instances where this approach may not be suitable for fields that have the potential to contain null values.
To address this issue, you can utilize the $ifNull
operator. Simply replace fieldName
with the specific field you want to query:
db.myCollection.aggregate([
{
$project: {
fieldNameLength: {
$strLenCP: { $ifNull: ["$fieldName", ""] }
}
}
},
{
$group: {
_id: null,
maxLength: { $max: "$fieldNameLength" }
}
}
])
I'm curious about best practices regarding passing references of the socket object outside of a method handler. In the code snippet below, can anyone provide guidance on how to achieve this? io.on('connection', function (socket) { co ...
While testing my responsive design, I've noticed that using the toggle device tool in the Inspect tools of my browser produces the expected results. However, when I simply resize the browser window manually, the design does not respond as it should. C ...
I've been working on customizing my theme file with overrides, and I've encountered a strange bug while trying to style the outlined input. It seems like there are two borders appearing when these styles are implemented. https://i.stack.imgur.co ...
I have two large numbers: const num1 = 61921447244562694144000n; const num2 = 93068664972055293198336n; and I'm attempting to calculate the percentage change between them. I've experimented with three different methods - using regular numbers ...
I am trying to dynamically add the link text to the URL and trigger the opening of a new URL with the added query string when clicking on the original link. How can I achieve this using javascript or jQuery? <a href="www.mysite.com/search.aspx?kwd=" ...
I am currently developing a project with an emphasis on Web accessibility. Snippet of Code: function removeBorder(){ li=document.getElementById("link"); li.classList.add(".remove") } body{ background:#dddddd; } p:focus{ border:1px solid red; } li{ ...
Introducing my latest creation: Frogga, a Chrome Extension that can be accessed from Frogga on GitHub I've been experimenting with different approaches, but I'm only able to access the initial JSON layer. I have the potential to dig deeper, but ...
While attempting to dynamically add rows to a table using Javascript and jQuery, I encountered an issue. Here is my code: <script> $(document).ready(function(){ for (i=0; i<myvar.length; i++){ $("#items").after('<tr class="item- ...
I have documents in Mongo structured as follows: dateRange: [{ "price": "200", "dateStart": "2014-01-01", "dateEnd": "2014-01-30" }, { "price": "220", "dateStart": "2014-02-01", "dateEnd": "2014-02-15" }] It seems simple at first ...
It appears that there is a limitation in the Raphael Javascript library when it comes to displaying SVG polygons. Despite this, I am working on developing an application that requires the ability to read and display SVGs using Raphael, yet many of these SV ...
I have a data collection containing documents like the following: { "_id" : ObjectId("5f797a8f03b66b73edd4f56f"), "totalCounts" : 2300, "roadId" : "road_2", "type" : "CALL ...
Utilizing the ng-class feature to include CSS classes has been a bit challenging for me. Despite reading numerous articles on the topic, I am still struggling with implementing a function call within ng-class. Below is the expression I am working with: n ...
What distinguishes checking an array's length as a truthy value from verifying that it is greater than zero? In simple terms, is there any advantage in utilizing one of these conditions over the other: var arr = [1,2,3]; if (arr.length) { } if (arr ...
Assuming that toShowVar is undefined, which of these options would be more costly? <span ng-bind="toShowVar" ng-show="toShowVar"></span> or <span ng-bind="toShowVar"></span> The latter option would clearly not display anything o ...
Within my Angular2 project, I have defined an Interface called GridMetadata: grid-metadata.ts export interface GridMetadata { activity: string; createdAt: object; totalReps: number; updatedAt: object; } In my Service, there is a public method na ...
My current issue involves using the Raycaster in THREE.js to focus on objects with the mouse position. While I've successfully done this many times before, something seems to be off in my current setup. Strangely, the onFocus callback occasionally tr ...
My code example is as follows: <div class="info-container"> <span class="item1">item1</span> <a class="item2" href="#">item2</a> <a class="item3" href="#">item3</a> </div> I want to rearran ...
Hello, I am currently using Next.js and encountering an issue with using if/else in JSX. When I use if conditions, the classes of elements do not load correctly. Here is my code: <Nav> { login ? ...
I'm currently conducting test cases for my API using Chai, Mocha, and Chai HTTP. Even when I return a response of 500, my test case is still passing. Below is my test case: describe('/POST saveBatch', () => { it('it should save ...
Whenever I attempt to implement a service worker on my progressive web application page, why does the browser console display this specific error message? ERROR "Uncaught (in promise) DOMException: Only secure origins are allowed JavaScript Code: ...