summaryrefslogtreecommitdiff
path: root/jstests/aggregation/sources/lookup/lookup_non_correlated.js
blob: d7323d861c1c309af59de61df5559c993ad26a7c (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());
})();