Агрегировать и проектировать с несколькими условиями - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть коллекция myCollection с массивом членов:

{
   name : String,
   members: [{status : Number, memberId : {type: Schema.Types.ObjectId, ref: 'members'}]
}

, и у меня есть эти данные

"_id" : ObjectId("5e83791eb49ab07a48e0282b")
   "members" : [ 
        {
            "status" : 1,
            "_id" : ObjectId("5e83791eb49ab07a48e0282c"),
            "memberId" : ObjectId("5e7dbf5b257e6b18a62f2da9")
        }, 
        {
            "status" : 2,
            "_id" : ObjectId("5e837944b49ab07a48e0282d"),
            "memberId" : ObjectId("5e7de2dbe027f43adf678db8")
        }
    ],

Я хочу проверить с помощью совокупного запроса, существует ли элемент 5e7dbf5b257e6b18a62f2da9 с status 1 но оно не вернулось истинным

db.getCollection('myCollection').aggregate([
        {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
        {
            $project: {
              isMember: { 
                $cond: [
                   { $and: [ {$in: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$members.memberId']}, {$eq: ['$members.status', 1]} ] },
                     // if
                    true, // then
                    false // else
                ]
            }

            }
        }
    ])

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 01 апреля 2020

Если вы хотите получить только true/false, вы можете использовать ярлык следующим образом:

db.collection.aggregate([
   { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
   {
      $project: {
         isMember: {
            $map: {
               input: "$members",
               in: {
                  $and: [
                     { $eq: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$$this.memberId'] },
                     { $eq: [1, '$$this.status'] }
                  ]
               }
            }
         }
      }
   },
   { $set: { isMember: { $anyElementTrue: "$isMember" } } }
])

Другой стиль будет таким:

db.collection.aggregate([
   { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
   {
      $project: {
         isMember: {
            $map: {
               input: "$members",
               in: {
                  $eq: [
                     { memberId: ("5e7dbf5b257e6b18a62f2da9"), status: 1 },
                     { memberId: "$$this.memberId", status: "$$this.status" }
                  ]
               }
            }
         }
      }
   },
   { $set: { isMember: { $anyElementTrue: "$isMember" } } }
])  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...