MongoDB: проверить массив для объекта и, если существует, вернуть true, иначе false - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь запросить массив в коллекции и спроецировать значение «true», если объект существует в массиве. Если объект не существует в массиве, проект "false". Я работаю в MongoDB, и я не слишком знаком с этим.

В моем сценарии у меня есть две коллекции, с которыми я работаю. Я собираю коллекцию «сотрудников» и выполняю функцию поиска $ для коллекции «бизнесов». В «бизнесах» у меня есть множество бизнес-возможностей.

Например, у меня есть набор сотрудников

staff = [
  ...
  {_id: 1, businessId: 11},
  {_id: 2, businessId: 22},
  ....
]

Коллекция предприятий

businesses = [
  ...
  {_id: 11, capabilities: ["claiming", "pushing"]},
  {_id: 22, capabilities: ["claiming", "popping"]},
  ....
]

И настройку $ lookup, такую ​​как

db.getCollection('staff').aggregate([
    {
        $lookup:
            {
                from: "businesses",
                localField: "businessId",
                foreignField: "_id",
                as: "business_Info"
            }
    },

Как я могу рассчитать на $ проект для каждого сотрудника значение, равное $ canClaim: true, если в заявке «заявка» присутствует «заявка»?

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы можете использовать $in оператор агрегирования, чтобы проверить, содержит ли массив значение.

db.getCollection("staff").aggregate([
  { "$lookup": {
    "from": "businesses",
    "localField": "businessId",
    "foreignField": "_id",
    "as": "business_Info"
  }},
  { "$unwind": "$business_Info" },
  { "$addFields": {
    "canClaim": { "$in": ["claiming", "$business_Info.capabilities"] }
  }}
])

MongoPlayground

0 голосов
/ 11 мая 2019
db.getCollection("staff").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $lookup: // Equality Match
            {
                from: "businesses",
                localField: "businessId",
                foreignField: "_id",
                as: "businessInfo"
            }

            // Uncorrelated Subqueries
            // (supported as of MongoDB 3.6)
            // {
            //    from: "<collection to join>",
            //    let: { <var_1>: <expression>, …, <var_n>: <expression> },
            //    pipeline: [ <pipeline to execute on the collection to join> ],
            //    as: "<output array field>"
            // }
        },

        // Stage 2
        {
            $project: {
                businessId: 1,
                businessInfo: {
                    $arrayElemAt: ['$businessInfo', 0]
                }
            }
        },

        // Stage 3
        {
            $addFields: {
                "businessInfo.canClaim": {
                    $cond: {
                        if: {
                            $gte: [{
                                $indexOfArray: ["$businessInfo.capabilities", 'claiming']
                            }, 0]
                        },
                        then: true,
                        else: false
                    }
                }
            }
        },

    ]



);
...