как получить данные поста с флагом как в mongodb? - PullRequest
0 голосов
/ 11 января 2020

У меня есть коллекция postData, а внутри postData есть массив объектов, в которых хранится userId. Я хочу получить данные поста с флагом. Пример. - - Если я передам userId в запросе, я хочу получить postData с флагом true / flase, который сообщит, что данный идентификатор пользователя присутствует или отсутствует в массиве объектов.

Вот схема коллекции сообщений:

{
textData:String,
likes:[{uid:{type: mongoose.Schema.Types.ObjectId,ref: 'User'}}],
comments:[{...}],
videoUrl:String,
privacy:String
}

1 Ответ

0 голосов
/ 11 января 2020

В запросе мы добавляем новое поле с именем userIDExists, которое будет иметь логическое значение в зависимости от того, существует ли переданное в uid или нет, оно будет true или false, фильтруя userId массив и получение объекта обратно, если условие выполнено и $filter приведет к массиву объектов, которые соответствуют $cond, тогда size>0 даст логическое значение, основанное на том, возвращены ли какие-либо объекты:

db.postData.aggregate([{
    $addFields: {
        userIDExists: {
            $gt: [{
                $size: {
                    $filter: {
                        input: "$userId",
                        as: "each",
                        cond: { $eq: ["$$each.uid", 1] }
                    }
                }
            }, 0]
        }
    }
}])

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e197f02627ef782367de3cf"),
    "userId" : [ 
        {
            "uid" : 1
        }, 
        {
            "uid" : 2
        }, 
        {
            "uid" : 4
        }
    ],
    "comments" : [],
    "videoUrl" : "",
    "textData" : "NO",
    "privacy" : "YES"
}

/* 2 */
{
    "_id" : ObjectId("5e197f13627ef782367de4f6"),
    "userId" : [ 
        {
            "uid" : 11
        }, 
        {
            "uid" : 21
        }, 
        {
            "uid" : 41
        }
    ],
    "comments" : [],
    "videoUrl" : "",
    "textData" : "YES",
    "privacy" : "NO"
}

Результат: В документе 1 userIDExists : true, поскольку "uid" : 1 существует.

/* 1 */
{
    "_id" : ObjectId("5e197f02627ef782367de3cf"),
    "userId" : [ 
        {
            "uid" : 1
        }, 
        {
            "uid" : 2
        }, 
        {
            "uid" : 4
        }
    ],
    "comments" : [],
    "videoUrl" : "",
    "textData" : "NO",
    "privacy" : "YES",
    "userIDExists" : true
}

/* 2 */
{
    "_id" : ObjectId("5e197f13627ef782367de4f6"),
    "userId" : [ 
        {
            "uid" : 11
        }, 
        {
            "uid" : 21
        }, 
        {
            "uid" : 41
        }
    ],
    "comments" : [],
    "videoUrl" : "",
    "textData" : "YES",
    "privacy" : "NO",
    "userIDExists" : false
}
...