Skip to content

Commit fff6552

Browse files
author
Chris Cho
authored
DOCSP-23138: Densify Aggregates Builder (#272)
* DOCSP-23138: Densify Aggregates Builder
1 parent 010cf98 commit fff6552

File tree

4 files changed

+140
-30
lines changed

4 files changed

+140
-30
lines changed

source/fundamentals/builders/aggregates.txt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,61 @@ and ``temperature`` fields:
787787
:language: java
788788
:dedent:
789789

790+
Densify
791+
-------
792+
793+
Use the ``densify()`` method to create a
794+
`$densify <https://www.mongodb.com/docs/rapid/reference/operator/aggregation/densify/>`__
795+
pipeline stage that generates a sequence of documents to span a specified
796+
interval.
797+
798+
.. tip::
799+
800+
You can use the ``$densify()`` aggregation stage only when running
801+
MongoDB v5.1 or later.
802+
803+
Consider the following documents retrieved from the :atlas:`Atlas sample weather dataset </sample-data/sample-weather>`
804+
that contain measurements for a similar ``position`` field, spaced one hour
805+
apart:
806+
807+
.. code-block:: none
808+
:copyable: false
809+
810+
Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }}
811+
Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}
812+
813+
Suppose you needed to create a pipeline stage that performs the following
814+
actions on these documents:
815+
816+
- Add a document at every 15-minute interval for which a ``ts`` value does not
817+
already exist.
818+
- Group the documents by the ``position`` field.
819+
820+
The call to the ``densify()`` aggregation stage builder that accomplishes
821+
these actions should resemble the following:
822+
823+
.. literalinclude:: /includes/fundamentals/code-snippets/builders/AggregateDensify.java
824+
:start-after: // begin densify aggregate
825+
:end-before: // end densify aggregate
826+
:language: java
827+
:dedent:
828+
829+
The following output highlights the documents output by the aggregate stage
830+
which contain ``ts`` values every 15 minutes between the existing documents:
831+
832+
.. code-block:: none
833+
:emphasize-lines: 2-4
834+
:copyable: false
835+
836+
Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }}
837+
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:15:00 EST 1984 }}
838+
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:30:00 EST 1984 }}
839+
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:45:00 EST 1984 }}
840+
Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}
841+
842+
See the `densify() API documentation <{+api+}/apidocs/mongodb-driver-core/com/mongodb/client/model/Aggregates.html#densify(java.lang.String,com.mongodb.client.model.densify.DensifyRange)>`__
843+
for more information.
844+
790845
Atlas Full-Text Search
791846
----------------------
792847

source/includes/fundamentals/code-snippets/builders/AccumulatorsPickN.java

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,26 @@
99
import com.mongodb.client.MongoClient;
1010
import com.mongodb.client.MongoClients;
1111
import com.mongodb.client.MongoCollection;
12-
import com.mongodb.client.MongoDatabase;
13-
import com.mongodb.client.model.Accumulators;
14-
import com.mongodb.client.model.Aggregates;
15-
import com.mongodb.client.model.Sorts;
12+
import static com.mongodb.client.model.Accumulators.*;
13+
import static com.mongodb.client.model.Aggregates.*;
14+
import static com.mongodb.client.model.Sorts.*;
15+
import static java.util.Arrays.asList;
1616

1717
public class AccumulatorsPickN {
1818
private static final String CONNECTION_URI = "<your connection URI>";
1919

2020
private static void runAggregation(MongoCollection<Document> collection, Bson ...stages) {
2121
System.out.println("aggregateStages: " + Arrays.toString(stages));
2222
System.out.println("=== [ Result ] ============================================");
23-
collection.aggregate(Arrays.asList(stages)).forEach(result -> System.out.println(result));
23+
collection.aggregate(asList(stages)).forEach(result -> System.out.println(result));
2424
}
2525

2626
private static Bson createMinNStage() {
2727
return
2828
// begin minN accumulator
29-
Aggregates.group(
29+
group(
3030
"$year",
31-
Accumulators.minN(
31+
minN(
3232
"lowest_three_ratings",
3333
new BsonString("$imdb.rating"),
3434
3
@@ -38,9 +38,9 @@ private static Bson createMinNStage() {
3838
private static Bson createnMaxNStage() {
3939
return
4040
// begin maxN accumulator
41-
Aggregates.group(
41+
group(
4242
"$year",
43-
Accumulators.maxN(
43+
maxN(
4444
"highest_two_ratings",
4545
new BsonString("$imdb.rating"),
4646
2
@@ -50,9 +50,9 @@ private static Bson createnMaxNStage() {
5050
private static Bson createFirstNStage() {
5151
return
5252
// begin firstN accumulator
53-
Aggregates.group(
53+
group(
5454
"$year",
55-
Accumulators.firstN(
55+
firstN(
5656
"first_four_movies",
5757
new BsonString("$title"),
5858
4
@@ -62,9 +62,9 @@ private static Bson createFirstNStage() {
6262
private static Bson createLastNStage() {
6363
return
6464
// begin lastN accumulator
65-
Aggregates.group(
65+
group(
6666
"$year",
67-
Accumulators.lastN(
67+
lastN(
6868
"last_three_movies",
6969
new BsonString("$title"),
7070
3
@@ -74,50 +74,50 @@ private static Bson createLastNStage() {
7474
private static Bson createTopStage() {
7575
return
7676
// begin top accumulator
77-
Aggregates.group(
77+
group(
7878
"$year",
79-
Accumulators.top(
79+
top(
8080
"top_rated_movie",
81-
Sorts.descending("imdb.rating"),
82-
Arrays.asList(new BsonString("$title"), new BsonString("$imdb.rating"))
81+
descending("imdb.rating"),
82+
asList(new BsonString("$title"), new BsonString("$imdb.rating"))
8383
));
8484
// end top accumulator
8585
}
8686

8787
private static Bson createTopNStage() {
8888
return
8989
// begin topN accumulator
90-
Aggregates.group(
90+
group(
9191
"$year",
92-
Accumulators.topN(
92+
topN(
9393
"longest_three_movies",
94-
Sorts.descending("runtime"),
95-
Arrays.asList(new BsonString("$title"), new BsonString("$runtime")),
94+
descending("runtime"),
95+
asList(new BsonString("$title"), new BsonString("$runtime")),
9696
3
9797
));
9898
// end topN accumulator
9999
}
100100
private static Bson createBottomStage() {
101101
return
102102
// begin bottom accumulator
103-
Aggregates.group(
103+
group(
104104
"$year",
105-
Accumulators.bottom(
105+
bottom(
106106
"shortest_movies",
107-
Sorts.descending("runtime"),
108-
Arrays.asList(new BsonString("$title"), new BsonString("$runtime"))
107+
descending("runtime"),
108+
asList(new BsonString("$title"), new BsonString("$runtime"))
109109
));
110110
// end bottom accumulator;
111111
}
112112
private static Bson createBottomNStage() {
113113
return
114114
// begin bottomN accumulator
115-
Aggregates.group(
115+
group(
116116
"$year",
117-
Accumulators.bottomN(
117+
bottomN(
118118
"lowest_rated_two_movies",
119-
Sorts.descending("imdb.rating"),
120-
Arrays.asList(new BsonString("$title"), new BsonString("$imdb.rating")),
119+
descending("imdb.rating"),
120+
asList(new BsonString("$title"), new BsonString("$imdb.rating")),
121121
2
122122
));
123123
// end bottomN accumulator;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package fundamentals.builders;
2+
3+
import java.util.Arrays;
4+
5+
import org.bson.BsonArray;
6+
import org.bson.Document;
7+
import org.bson.conversions.Bson;
8+
9+
import com.mongodb.client.MongoClient;
10+
import com.mongodb.client.MongoClients;
11+
import com.mongodb.client.MongoCollection;
12+
import com.mongodb.client.model.Aggregates;
13+
import com.mongodb.client.model.Filters;
14+
import com.mongodb.client.model.MongoTimeUnit;
15+
import com.mongodb.client.model.densify.DensifyOptions;
16+
import com.mongodb.client.model.densify.DensifyRange;
17+
18+
public class AggregateDensify {
19+
private static final String CONNECTION_URI = "<your connection URI>";
20+
21+
private static void runAggregation(MongoCollection<Document> collection, Bson ...stages) {
22+
System.out.println("aggregateStages: " + Arrays.toString(stages));
23+
System.out.println("=== [ Result ] ============================================");
24+
collection.aggregate(Arrays.asList(stages)).forEach(result -> System.out.println(result));
25+
}
26+
27+
// Narrows down the data in the sample_weatherdata.data namespace
28+
private static Bson createMatchStage() {
29+
return Aggregates.match(Filters.eq("position.coordinates", BsonArray.parse("[-47.9, 47.6]")));
30+
}
31+
32+
33+
private static Bson createDensifyStage() throws Exception {
34+
return Aggregates.
35+
// begin densify aggregate
36+
densify(
37+
"ts",
38+
DensifyRange.partitionRangeWithStep(15, MongoTimeUnit.MINUTE),
39+
DensifyOptions.densifyOptions().partitionByFields("position.coordinates"));
40+
// end densify aggregate
41+
}
42+
43+
public static void main(String[] args) {
44+
try (MongoClient mongoClient = MongoClients.create(CONNECTION_URI)) {
45+
MongoCollection<Document> collection = mongoClient.getDatabase("sample_weatherdata").getCollection("data");
46+
47+
runAggregation(collection, createMatchStage(), createDensifyStage());
48+
} catch (Exception e) {
49+
System.err.println(e);
50+
}
51+
52+
}
53+
54+
}

source/whats-new.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ New features of the 4.7 driver release include:
7878

7979
- Added builder API methods for additional aggregation stages
8080
including :pipeline:`$search`/:pipeline:`$searchMeta` (Atlas only),
81-
:pipeline:`$densify`, and :pipeline:`$fill`.
81+
:pipeline:`$densify`, and :pipeline:`$fill`. Learn more about these
82+
methods on the :ref:`Aggregates Builder <aggregates-builders>` page.
8283

8384
- Added the ``BsonExtraElements`` annotation that can be used with POJO encoding
8485
and decoding. ``BsonExtraElements`` enables decoding objects that may receive

0 commit comments

Comments
 (0)