Выберите поле по базе фильтра для вложенного и вложенного документа, например Post-> Comment-> Likes with mongo - PullRequest
0 голосов
/ 18 октября 2019
{
    "_id" : ObjectId("5da7c114753c6202f4f4d3b2"),

    "image" : "hem sopheap-1571275028119.jpg",
    "body" : "my first post\r\nyes this my post",
    "date" : ISODate("2019-10-17T00:59:18.901Z"),
    "comments" : [ 
        {
            "user" : "5d999578aeb073247de4bd6e",
            "fullname" : "hem sopheap",
            "username" : "sopheap",
            "comment" : "My first comment",
            "_id" : ObjectId("5da7c125753c6202f4f4d3b4"),
            "replies" : []
        }, 
        {
            "user" : "5da85558886aee13e4e7f044",
            "fullname" : "soeng kanel",
            "username" : "",
            "comment" : "Mr. kansael comment",
            "_id" : ObjectId("5da8557f886aee13e4e7f045"),
            "replies" : [],
            "date" : ISODate("2019-10-17T10:10:37.394Z"),
            "likes" : [ 
             "5d999578aeb073247de4bd6e", 
             "5d999578aeb073247de4bd6f"
            ]
        }
    ],
    "__v" : 41,
    "likes" : [ 
            "5d999578aeb073247de4bd6e", 
            "5d999578aeb073247de4bd6p"
        ]
}

Я хочу получить все likes определенного comments, не похожего на post что-то похожее в SQL-выражении:

db.posts.find({
  "comments": {
    $elemMatch: {
      "_id": ObjectId("5da8557f886aee13e4e7f045")
    }
  }
}, {
  likes:"$comments", _id:0
}).pretty()

, и ожидаемый результат должен быть такимэто

"likes" : [ "5d999578aeb073247de4bd6e", "5d999578aeb073247de4bd6f" ]

1 Ответ

1 голос
/ 19 октября 2019

Подробнее о $ elemMatch

Вот полный запрос для вас

db.posts.find({
  "comments": {
    $elemMatch: {
      "user": "5da85558886aee13e4e7f044",
      "_id": ObjectId("5da8557f886aee13e4e7f045")
    }
  }
}, {
  likes:"$comments.likes", _id:0
}).pretty()

Объяснение:

Распространенная ошибка, которую люди делают при фильтрации по нескольким полям вложенных документов массива, состоит в том, чтобы просто сделать что-то вроде {"comments._id": "something", "comments.user": "something"}, который возвращает все элементы вложенного документа массива, где какой-либо элемент соответствует id пользователя. Решение этой проблемы: $ elemMatch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...