Запрос MongoDB с левым соединением - PullRequest
0 голосов
/ 26 октября 2018

Я выполняю запрос mongodb или я использовал LEFT JOIN для базы данных SQL.

Вот документ профиля:

{
    "_id" : ObjectId("5bd22f28f77cfb1f6ce503ca"),
    "search" : "flarize",
    "name" : "flarize",
    "email" : "flarize.ba73@gmail.com",
    "password" : "$2a$10$eYeOtEkEUyD7TFkjKvhZOuSSpvBolkL17TrPHuoHhOT8JrsQR0UKW",
    "color" : 0,
    "profil" : "",
    "banner" : "",
    "desc" : "",
    "date" : 1540501286109,
    "friend" : [
            {
                    "id" : ObjectId("5bd19a92da24674fdabd26b6")
            }
    ],
    "groupes" : [ ]
}

В настоящее время я использую этот запрос:

db.users.find({search: /f/}).limit(20);

этот запрос только что задал профиль в соответствии с регулярным выражением.

Могу ли я хотеть больше, если идентификатор человека, который вызывает этот запрос, присутствует в разделе друг, то мы добавляем:

is_friend: true

еще добавить:

is_friend: false

РЕДАКТИРОВАТЬ:

Для этого запроса у нас есть:

Идентификатортех, кто вызывает запрос, и пытается узнать, присутствует ли этот идентификатор в поле друга.

РЕДАКТИРОВАТЬ

Я пытаюсь это, но не работает, возвращаю false.

herdb.users.aggregate([{$match:{"search":"flarize"}},
    {$project:
        {search: 1, name: 1, color: 1, profil: 1, banner: 1, desc: 1, date: 1, friend:10, groupes:10, 
        is_friend:
            {$cond:[
                {$eq:["$friend.id", ObjectId("5bd19a92da24674fdabd26b6")]},
                true, 
                false]
            }
        }
    }
]).pretty();

Спасибо за помощь.

1 Ответ

0 голосов
/ 26 октября 2018

Используйте $unwind для друга, прежде чем сопоставить его id

$eq не работает для массива.

db.getCollection('tests').aggregate([
    { $match: {"search":"flarize"} },
    { $unwind: "$friend"},
    { $project:{
        search: 1, name: 1, color: 1, profil: 1, banner: 1, desc: 1, date: 1, friend:10, groupes:10,
        is_friend: { $cond: [
            { $eq :["$friend.id", ObjectId("5bd19a92da24674fdabd26b6")]}, true,  false ]}
        }
    }
]);

Выход:

/* 1 */
{
    "_id" : ObjectId("5bd22f28f77cfb1f6ce503ca"),
    "search" : "flarize",
    "name" : "flarize",
    "color" : 0,
    "profil" : "",
    "banner" : "",
    "desc" : "",
    "date" : NumberLong(1540501286109),
    "friend" : {
        "id" : ObjectId("5bd19a92da24674fdabd26b6"),
        "id" : ObjectId("5bd19a92da24674fdabd26b4"),
        "id" : ObjectId("5bd19a92da24674fdabd26b2"),
        "id" : ObjectId("5bd19a92da24674fdabd26b1")
    },
    "groupes" : [],
    "is_friend" : true
}
<Ч />

И если вы хотите friend вернуть его в список массивов:

db.getCollection('tests').aggregate([
    { $match: {"search":"flarize"} },
    { $unwind: "$friend"},
    { $project:
        {
            search: 1, name: 1, color: 1, profil: 1, banner: 1, desc: 1, date: 1, friend:10, groupes:10,
            is_friend: { $cond: [
                { $eq :["$friend.id", ObjectId("5bd19a92da24674fdabd26b6")]}, true,  false ]}
        }
    },
    {$group : {
        _id: "$_id",
        search : {$first: "$search"},
        name : {$first: "$name"},
        color : {$first: "$color"},
        profil : {$first: "$profil"},
        banner : {$first: "$banner"},
        desc : {$first: "$desc"},
        date : {$first: "$date"},
        groupes : {$first: "$groupes"},
        friend : {$push: "$friend"},
        is_friend: {$first: "$is_friend"}
     }}
])
...