множественный вложенный фильтр в Mongoose - PullRequest
0 голосов
/ 05 октября 2018

Мой json будет выглядеть следующим образом:

 {
      "proj_id" : objectId1
      "author": {},
      "message": "This is post1",
      "comments": [
        {
          "insId" : objectId1
          "message": "Hii",
        "location": [
                     {"select":"Y",id:1},
             {"select":"N",,id:2}
            ]

    },
    {
      "insId" : objectId2
        "message": "Hii2",
        "location": [
                 {"select":"Y",id:1},
         {"select":"N",,id:2}
        ]
    },

  ]
},
{
  "proj_id" : objectId2
  "author": {},
  "message": "This is post2",
  "comments": [
    {
      "insId" : objectId1
      "message": "welcome2",
      location: [
                 {"select":"Y",id:1},
         {"select":"N",,id:2}
        ]

    },

    {
    "insId" : objectId2
        "message": "welcome4",
        "location": [
                 {"select":"Y",id:1},
         {"select":"N",,id:2}
        ]

    }
  ]
}

Ожидаемый результат:

{
  "proj_id" : objectId1
  "author": {},
  "message": "This is post1",
  "comments": [
    {
      "insId" : objectId1
      "message": "Hii",
    "location": [
                 {"select":"Y",id:1},
        ]

    }
  ]
}

Необходимо фильтровать на основе идентификатора проверки и данных проверки внутри. Я должен указать только местоположение, котороеИмея статус "Y"

Я попытался следующий код, отфильтровывая с проверкой Id

mongo.inspection.aggregate([
    {$match: {"comments.insId": ObjectId(req.body.insId),"projectID":ObjectId(req.body.proj_id) }},
    {$addFields : {"comments":{$filter:{ // We override the existing field!
    input: "$comments",
    as: "comments",
    cond: {$eq: ["$$comments.insId", ObjectId(req.body.insId)]}

    }}}}

],function(err,response){
console.log(response);
}

Вывод:

{
  "proj_id" : objectId1
  "author": {},
  "message": "This is post1",
  "comments": [
    {
      "insId" : objectId1
      "message": "Hii",
    "location": [
                 {"select":"Y",id:1},
         {"select":"N",id:1}, // But it should not be list
        ]

    }
  ]
}

Поэтому я должен фильтровать объект на основеcomments.insId и из этого единственного объекта я должен удалить объект внутри местоположения на основе статуса.Как мне получить этот результат в мангусте

Ответы [ 2 ]

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

Попробуйте следующий запрос.Здесь я раскручиваю объекты после фильтрации.Затем снова отфильтруйте объекты и сгруппируйте их, чтобы получить в исходном формате.

mongo.inspection.aggregate([
  {$match: {"proj_id": "objectId1", "comments.insId": " objectId1", "comments.location.select": "Y"}},
  {$unwind:{path: "$comments", preserveNullAndEmptyArrays: false}},
  {$match: {"comments.insId": " objectId1", "comments.location.select": "Y"}},
  {$unwind:{path: "$comments.location", preserveNullAndEmptyArrays: false}},
  {$match: {"comments.location.select": "Y"}},

  {$group: {
      _id: {proj_id : "$proj_id", ins_id: "$comments.insId"}, 
      author : {$first: "$author"}, 
      message : {$first: "$message"},
      comm_message:{$first: "$comments.message"}, 
      location:{$push: "$comments.location"} 
  }},
  {$group: {
      _id: "$_id.proj_id",
      author : {$first: "$author"},
      message : {$first: "$message"}, 
      comments:{$push:{message: "$comm_message", location: "$location", insId: "$_id.ins_id"}}

  }}

])

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

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

Используйте $map с $filter.

Что-то вроде

{
  "$addFields":{
    "comments":{
      "$map":{
        "input":{
          "$filter":{
            "input":"$comments","as":"commentsf","cond":{"$eq":["$$commentsf.insId", ObjectId(req.body.insId)]}
          }
        },
        "as":"commentsm",
        "in":{
          "insId":"$$commentsm.insId",
          "message":"$$commentsm.message",
          "location":{"$filter":{"input":"$$commentsm.location","as":"location","cond":{"$eq":["$$location.select","Y"]}}}
        }
      }
    }
  }
}
...