Поиск с условием mongoDb - PullRequest
       10

Поиск с условием mongoDb

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

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

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

и коллекция членов

{
    firstname : String,
    lastname  : String
}

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

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

Я хочу выбрать только членов статуса 1 и выполнить поиск для получения данных членов, я пробовал это, но он возвращает статус всех участников (1 и 2), как я могу сделать запрос, спасибо.

db.getCollection('myCollection').aggregate([
    {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
           { "$lookup": {
                "from": "members",
                "let": { "ar": "$members.memberId" , "ar2": "$members.status" },


    "pipeline": [
      { "$match": {
        "$expr": {
          "$cond": [
            { "$in": ["$_id", "$$ar"] },

          {},
           { "$eq": [1, "$$ar2"] }, 
          ]
        }
      }}
    ],
    "as": "Member"
  }},
         {   $project: {

                 "Member._id" : 1,
                "Member.firstname" : 1,
                "Member.lastname" : 1
            }

        }

    ])

1 Ответ

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

Если вам нужны только данные со статусом 1, вы должны сделать это, сначала отфильтровав результаты, а затем использовать $ lookup

$match:{
    "members.status":1
}

Я не знаю, зачем вам нужен _id в $ match, но вышеупомянутый объект $ match будет работать, чтобы отфильтровать результаты

...