summaryrefslogtreecommitdiff
path: root/jstests/aggregation/sources/lookup/lookup_non_correlated.js
blob: 523eb37f8d4cf16819c1f8ad111dd232d2fb1add (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Cannot implicitly shard accessed collections as $lookup does not support sharded target
// collection.
// @tags: [assumes_unsharded_collection]

/**
 * Confirms that $lookup with a non-correlated foreign pipeline returns expected results.
 */
(function() {
    "use strict";

    const testDB = db.getSiblingDB("lookup_non_correlated");
    const localName = "local";
    const localColl = testDB.getCollection(localName);
    localColl.drop();
    const foreignName = "foreign";
    const foreignColl = testDB.getCollection(foreignName);
    foreignColl.drop();

    assert.writeOK(localColl.insert({_id: "A"}));
    assert.writeOK(localColl.insert({_id: "B"}));
    assert.writeOK(localColl.insert({_id: "C"}));

    assert.writeOK(foreignColl.insert({_id: 1}));
    assert.writeOK(foreignColl.insert({_id: 2}));
    assert.writeOK(foreignColl.insert({_id: 3}));

    // Basic non-correlated lookup returns expected results.
    let cursor = localColl.aggregate([
        {$match: {_id: {$in: ["B", "C"]}}},
        {$sort: {_id: 1}},
        {$lookup: {from: foreignName, as: "foreignDocs", pipeline: [{$match: {_id: {"$gte": 2}}}]}},
    ]);

    assert(cursor.hasNext());
    assert.docEq({_id: "B", foreignDocs: [{_id: 2}, {_id: 3}]}, cursor.next());
    assert(cursor.hasNext());
    assert.docEq({_id: "C", foreignDocs: [{_id: 2}, {_id: 3}]}, cursor.next());
    assert(!cursor.hasNext());

    // Non-correlated lookup followed by unwind on 'as' returns expected results.
    cursor = localColl.aggregate([
        {$match: {_id: "A"}},
        {$lookup: {from: foreignName, as: "foreignDocs", pipeline: [{$match: {_id: {"$gte": 2}}}]}},
        {$unwind: "$foreignDocs"}
    ]);

    assert(cursor.hasNext());
    assert.docEq({_id: "A", foreignDocs: {_id: 2}}, cursor.next());
    assert(cursor.hasNext());
    assert.docEq({_id: "A", foreignDocs: {_id: 3}}, cursor.next());
    assert(!cursor.hasNext());

    // Non-correlated lookup followed by unwind and filter on 'as' returns expected results.
    cursor = localColl.aggregate([
        {$match: {_id: "A"}},
        {$lookup: {from: foreignName, as: "foreignDocs", pipeline: [{$match: {_id: {"$gte": 2}}}]}},
        {$unwind: "$foreignDocs"},
        {$match: {"foreignDocs._id": 2}}
    ]);

    assert(cursor.hasNext());
    assert.docEq({_id: "A", foreignDocs: {_id: 2}}, cursor.next());
    assert(!cursor.hasNext());
})();