Что не так с моим запросом монго, чтобы получить конкретный по гнезду документ? - PullRequest
0 голосов
/ 03 ноября 2019
{
    "_id" : ObjectId("5dbdacc28cffef0b94580dbd"),
    "owner" : {
        "image" : "https://lh3.googleusercontent.com/a-/AAuE7mCpG2jzbEdffPgdeVWnkBKwyzCCwEB1HMbU1LAVAg=s50",
        "fullname" : "soeng kanel",
        "userID" : "5da85558886aee13e4e7f044"
    },
    "image" : "soeng kanel-1572711618984.png",
    "body" : "sdadadasdsadadas sds",
    "date" : ISODate("2019-11-02T16:20:05.558Z"),
    "comments" : [ 
        {
            "user" : "5da85558886aee13e4e7f044",
            "fullname" : "soeng kanel",
            "username" : "",
            "comment" : "sdsfdsfdsfds",
            "_id" : ObjectId("5dbdacc78cffef0b94580dbf"),
            "replies" : [ 
                {
                    "likes" : [ 
                        "5da85558886aee13e4e7f044"
                    ],
                    "date" : ISODate("2019-11-02T16:20:05.558Z"),
                    "_id" : ObjectId("5dbdacd78cffef0b94580dc0"),
                    "reply" : "r1111111",
                    "username" : "",
                    "fullname" : "soeng kanel",
                    "user" : "5da85558886aee13e4e7f044"
                }, 
                {
                    "likes" : [],
                    "date" : ISODate("2019-11-02T16:20:05.558Z"),
                    "_id" : ObjectId("5dbdacdb8cffef0b94580dc1"),
                    "reply" : "r222222",
                    "username" : "",
                    "fullname" : "soeng kanel",
                    "user" : "5da85558886aee13e4e7f044"
                }, 
                {
                    "likes" : [],
                    "date" : ISODate("2019-11-03T03:04:23.528Z"),
                    "_id" : ObjectId("5dbe4749fa751f05afcc1bd6"),
                    "reply" : "33333333",
                    "username" : "",
                    "fullname" : "soeng kanel",
                    "user" : "5da85558886aee13e4e7f044"
                }
            ],
            "date" : ISODate("2019-11-02T16:20:05.558Z"),
            "likes" : []
        }
    ],
    "likes" : [ 
        "5da85558886aee13e4e7f044"
    ],
    "project" : {},
    "__v" : 2
}

Мой запрос

db.getCollection("posts").aggregate([
    { $match: {_id: ObjectId("5dbdacc28cffef0b94580dbd"), "comments._id": ObjectId("5dbdacc78cffef0b94580dbf") }},
    { $unwind: "$comments"},
    { $match: { "comments._id": ObjectId("5dbdacc78cffef0b94580dbf")}},

    { $project: {"replies": "$comments.replies", _id: 0}},

    { $match: { "replies._id": ObjectId("5dbdacd78cffef0b94580dc0")}},

    { $project: {"likes": "$replies.likes", _id: 0}},
    ])

С помощью этого запроса я получаю 3 элемента:

{
    "likes" : [ 
        [ 
            "5da85558886aee13e4e7f044"
        ], 
        [], 
        []
    ]
}

Это не то, что я хочу, а то, что я хочу, это получить по конкретномуreplies этим _id 5dbdacd78cffef0b94580dc0.

И моим ожиданием

{
        "likes" : [ 
            [ 
                "5da85558886aee13e4e7f044"
            ]
        ]
    }

1 Ответ

1 голос
/ 03 ноября 2019

Попробуйте использовать $unwind в ответах до вы $match этап в ответах.

db.collection.aggregate([
  {
    $match: {
      _id: ObjectId("5dbdacc28cffef0b94580dbd"),
      "comments._id": ObjectId("5dbdacc78cffef0b94580dbf")
    }
  },
  {
    $unwind: {
      path: "$comments",
      preserveNullAndEmptyArrays: false
    }
  },
  {
    $match: {
      "comments._id": ObjectId("5dbdacc78cffef0b94580dbf")
    }
  },
  {
    $project: {
      "replies": "$comments.replies",
      _id: 0
    }
  },
  {
    $unwind: {
      path: "$replies",
      preserveNullAndEmptyArrays: false
    }
  },
  {
    $match: {
      "replies._id": ObjectId("5dbdacd78cffef0b94580dc0")
    }
  },
  {
    $project: {
      "likes": "$replies.likes"
    }
  }
])

При выполнении вышеупомянутого запроса выведите результат следующим образом:

[
  {
    "likes": [
      "5da85558886aee13e4e7f044"
    ]
  }
]

Я надеюсь, что все в порядке.

...