Как проверить $ setDifference в двух массивах с помощью монго-запроса - PullRequest
0 голосов
/ 10 января 2019

UserDetails

{
    "_id" : "5c23536f807caa1bec00e79b",
    "UID" : "1",
    "name" : "A",
},
{
    "_id" : "5c23536f807caa1bec00e78b",
    "UID" : "2",
    "name" : "B",
}

UserProducts

{
    "_id" : "5c23536f807caa1bec00e79c",
    "UPID" : "100",
    "UID" : "1"
},
{
    "_id" : "5c23536f807caa1bec00e79c",
    "UPID" : "200",
    "UID" : "2"
}

Группы

{
    "_id" : "5bb20d7556db6915846da55f",
    "members" : {
        "regularStudent" : [
            "200" // UPID
        ],
    }
}

Шаг 1

Мне нужно взять UID из UserDetails , проверить с помощью UserProducts , затем взять UPID из UserProducts

Шаг 2

мы должны проверить это UPID сопоставленное с группами коллекцию или нет? members.regularStudent мы сопоставлены UPID

Шаг 3

Предположим, что UPID не сопоставлено означает, что я хочу напечатать UPID из UserProducts

Я пытался, но не смог завершить, пожалуйста, помогите мне с этим.

Ожидаемый результат:

["100"]

Примечание. Ожидаемый результат - ["100"], поскольку UserProducts имеет UPID 100 & 200, но Группы отображаются только для коллекции 200.

Мой код

db.UserDetails.aggregate(
{
$lookup: {
    from: "UserProducts",
    localField: "UID",
    foreignField: "UID",
    as: "userProduct"
    }
},
{ $unwind: "$userProduct" },
{
    "$project": { "_id" : 0, "userProduct.UPID" : 1 }
},
{
    $group: {
        _id: null,
        userProductUPIDs: { $addToSet: "$userProduct.UPID" }
    }
}
) // returns [ "100", "200" ]

db.Groups.aggregate([
    {
        $unwind: "$members.regularStudent"
    },
    {
        $group: {
            _id: null,
            UPIDs: { $addToSet: "$members.regularStudent" }
        }
    }
]) // returns ["200"]

Теперь я хочу проверить $ setDifference обоих массивов, поэтому я добавил код ниже, но возвращаю ошибку, такую ​​как $userProductUPIDs is not defined

  db.Groups.aggregate([
    {
        $unwind: "$members.regularStudent"
    },
    {
        $group: {
            _id: null,
            UPIDs: { $addToSet: "$members.regularStudent" }
        }
    },
    {
        $project: {
            members: {
                $setDifference: [ $userProductUPIDs , "$members" ]
            },
            _id : 0
        }
    }
    ]) 

1 Ответ

0 голосов
/ 10 января 2019

Поскольку это продолжение одного из моих предыдущих ответов, я постараюсь исправить ваш код. Суть в том, что вам нужно два запроса, поскольку вы не можете обновить базу данных, поэтому код должен выглядеть следующим образом:

var queryResult = db.UserDetails.aggregate(
{
$lookup: {
    from: "UserProducts",
    localField: "UID",
    foreignField: "UID",
    as: "userProduct"
    }
},
{ $unwind: "$userProduct" },
{
    "$project": { "_id" : 0, "userProduct.UPID" : 1 }
},
{
    $group: {
        _id: null,
        userProductUPIDs: { $addToSet: "$userProduct.UPID" }
    }
});

let userProductUPIDs = queryResult.toArray()[0].userProductUPIDs;

db.Groups.aggregate([
    {
        $unwind: "$members.regularStudent"
    },
    {
        $group: {
            _id: null,
            UPIDs: { $addToSet: "$members.regularStudent" }
        }
    },
    {
        $project: {
            members: {
                $setDifference: [ userProductUPIDs , "$UPIDs" ]
            },
            _id : 0
        }
    }
]) // should return 100
...