У меня есть этот json в качестве документа моего сообщения:
{"_id":"nOneDzCuhE",
"type":"text",
"_p_chatRoomId":"chatrooms$BSxYYyUX49",
"chatRoomIdText":"BSxYYyUX49",
"_p_senderId":"_User$LD0r3WkuUD"
"message":"Hello World!"
"senderIdText":"LD0r3WkuUD"
"_created_at":"2018-08-29 19:52:46.678",
"_updated_at":"2018-08-29 19:52:46.678"
}
И это мой документ в чате:
{ "_id":"mfBRNbQ0gd",
"type":"Individuals",
"users": [
0: {"phone_number":"987654321","id":"7AifRl9D3T","name":"user1"},
1: {"phone_number":"123456789","id":"qapXotisT1","name":"User2"}
],
"_created_at": "2018-08-14 18:11:06.090",
"_updated_at":"2018-08-14 18:11:06.090"
}
Итак, сначала я хочу получить идентификатор из chatRoomIdText и использовать его, чтобы проверить, имеет ли этот чат номер моего телефона (под массивом пользователей).
Вкратце, я хочу показать все сообщения, в которых у их чата есть мой номер телефона: например, - 987654321.
Заранее спасибо.
Вы можете использовать вариант $lookup
pipe для применения $match
внутри объединенной коллекции в 3.6.
Предполагая, что присоединиться на chatRoomIdText
& _id
что - то вроде должно работать для вас.
db.message.aggregate([
{"$lookup":{
"from":"chatroom",
"let":{"chatRoomIdText":"$chatRoomIdText"},
"pipeline":[
{"$match":{
"$expr":{
"$and":[
{"$eq":["$$chatRoomIdText","$_id"]},
{"$in":["987654321","$users.phone_number"]}
]
}
}}
],
"as":"lookup-results"
}},
{"$match":{"lookup-results.0":{"$exists":true}}},
{"$project":{"lookup-results":0}}
])