У меня есть несколько запросов к одной коллекции:
1-й запрос:
db.getCollection('messagelogs').find({'intents.intent':'General_Positive_Feedback'},{'currentStep':1,'_id':0})
1-й результат запроса
{
"currentStep" : [
"flowkuec8ta1o"
]
}
Я использую результат первого запроса «flowkuec8ta1o» для второго запроса («currentStep» в результате запроса 1 используется как значение ключа «previousStep» в приведенном ниже втором запросе.):
2-й запрос:
db.getCollection('messagelogs').find({'previousStep':'flow1pemwl7ws'},{'userMessage':1})
2-й результат запроса:
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"userMessage" : "ILikedIt#1"
}
Как я могу объединить оба запроса в один?
Пожалуйста, не отмечайте этот вопрос как вопрос это. Я попробовал решение этого вопроса, которое не дало желаемого результата для меня. Кто-нибудь может помочь мне с этим?
Прикрепление образца документа 1 (откуда берется «currentStep»):
{
"_id" : ObjectId("5cec2dc69b806c4a00f91f16"),
"currentStep" : [
"flowkuec8ta1o"
],
"previousStep" : [
"conditioncplwf7pw1",
"condition00yokr6jv",
"conditionzq9koi6i3"
],
"userMessage" : "Liked It :)",
"intents" : [
{
"_id" : ObjectId("5cec2dc69b806c4a00f91f17"),
"intent" : "General_Positive_Feedback",
"score" : "0.9774518966674806"
}
]
}
Прикрепление образца документа 2 (где значение «currentStep», полученное из запроса 1, используется как «previousStep» во втором запросе)
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"currentStep" : [],
"previousStep" : [
"flowkuec8ta1o"
],
"userMessage" : "ILikedIt#1",
"intents" : [
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f19"),
"intent" : "Feedback",
"score" : "1"
}
]
}
Пример вывода:
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"userMessage" : "ILikedIt#1"
}
Добавление образцов документов по запросу @Fanparks:
Приведенные ниже два документа соответствуют первому запросу (чтобы получить «currentStep»)
Документ 1:
{
"currentStep": [
"flowkuec8ta1o"
],
"previousStep": [
"conditioncplwf7pw1",
"condition00yokr6jv",
"conditionzq9koi6i3"
],
"userMessage": "Liked It :)",
"intents": [{
"_id": ObjectId("5cec2dc69b806c4a00f91f17"),
"intent": "General_Positive_Feedback",
"score": "0.9774518966674806"
}]
}
Документ 2:
{
"currentStep": [
"flowkuec8ta1o"
],
"previousStep": [
"conditioncplwf7pw1",
"condition00yokr6jv",
"conditionzq9koi6i3"
],
"userMessage": "Just Okay, Could Be better",
"intents": [{
"_id": ObjectId("5cec2f1a9b806c4a00f91f41"),
"intent": "General_Positive_Feedback",
"score": "1"
}]
}
Приведенные ниже документы соответствуют второму запросу (где «предыдущий шаг» соответствует «текущему шагу», полученному из первого запроса)
Документ 1:
{
"currentStep": [],
"previousStep": [
"flowkuec8ta1o"
],
"userMessage": "ILikedIt#1",
"intents": [{
"_id": ObjectId("5cec2dd29b806c4a00f91f19"),
"intent": "Feedback",
"score": "1"
}]
}
Документ 2:
{
"currentStep": [],
"previousStep": [
"flowkuec8ta1o"
],
"userMessage": "JustOkayCouldBeBetter#1",
"intents": [{
"_id": ObjectId("5cec2f2b9b806c4a00f91f43"),
"intent": "Feedback",
"score": "1"
}]
}
Документ 3:
{
"currentStep": [],
"previousStep": [
"flowkuec8ta1o"
],
"userMessage": "I'mGivingAPositiveFeedback",
"intents": [{
"_id": ObjectId("5ced84e2fdf046078c85d9cb"),
"intent": "Feedback",
"score": "1"
}]
}
Документ 4:
{
"currentStep": [],
"previousStep": [
"flowkuec8ta1o"
],
"userMessage": "I'm giving a positive feedback for the second time!",
"intents": [{
"_id": ObjectId("5cede37dfdf046078c85d9e0"),
"intent": "Feedback",
"score": "1"
}]
}
Желаемый результат:
/* 1 */
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"userMessage" : "ILikedIt#1"
}
/* 2 */
{
"_id" : ObjectId("5cec2f2b9b806c4a00f91f42"),
"userMessage" : "JustOkayCouldBeBetter#1"
}
/* 3 */
{
"_id" : ObjectId("5ced84e2fdf046078c85d9ca"),
"userMessage" : "I'mGivingAPositiveFeedback"
}
/* 4 */
{
"_id" : ObjectId("5cede37dfdf046078c85d9df"),
"userMessage" : "I'm giving a positive feedback for the second time!"
}
** Фактический результат: **
/* 1 */
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"userMessage" : "ILikedIt#1"
}
/* 2 */
{
"_id" : ObjectId("5cec2f2b9b806c4a00f91f42"),
"userMessage" : "JustOkayCouldBeBetter#1"
}
/* 3 */
{
"_id" : ObjectId("5ced84e2fdf046078c85d9ca"),
"userMessage" : "I'mGivingAPositiveFeedback"
}
/* 4 */
{
"_id" : ObjectId("5cede37dfdf046078c85d9df"),
"userMessage" : "I'm giving a positive feedback for the second time!"
}
/* 5 */
{
"_id" : ObjectId("5cec2dd29b806c4a00f91f18"),
"userMessage" : "ILikedIt#1"
}
/* 6 */
{
"_id" : ObjectId("5cec2f2b9b806c4a00f91f42"),
"userMessage" : "JustOkayCouldBeBetter#1"
}
/* 7 */
{
"_id" : ObjectId("5ced84e2fdf046078c85d9ca"),
"userMessage" : "I'mGivingAPositiveFeedback"
}
/* 8 */
{
"_id" : ObjectId("5cede37dfdf046078c85d9df"),
"userMessage" : "I'm giving a positive feedback for the second time!"
}
@Fanpark Я обновил вопрос по вашему запросу. Пожалуйста, посмотрите
Вы можете использовать агрегацию ниже
db.getCollection('messagelogs').aggregate([
{ "$match": { "intents.intent": "General_Positive_Feedback" }},
{ "$lookup": {
"from": "messagelogs",
"let": { "currentStep": "$currentStep" },
"pipeline": [
{ "$match": { "$expr": { "$eq": ["$previousStep", "$$currentStep"] }}},
{ "$project": { "userMessage": 1 }}
],
"as": "previousStep"
}},
{ "$unwind": "$previousStep" },
{ "$replaceRoot": { "newRoot": "$previousStep" }},
{ "$group": {
"_id": "$userMessage",
"id": { "$first": "$_id" }
}},
{ "$project": {
"_id": "$id",
"userMessage": "$_id"
}}
])
Если в выражении previousStep
будет найдено более одного as
, то, вероятно, вы получите несколько записей, потому что следующим шагом, который мы сделали здесь, является $unwind
.
Обновлен мой ответ
Не могли бы вы объяснить с образцами документов и выводом
Фанпарк, не могли бы вы взглянуть на этот вопрос здесь?: stackoverflow.com/questions/56335641/… Я хочу знать, как правильно получать документы между двумя датами. Не могли бы вы взглянуть?
Пожалуйста, объясните, почему вы хотите объединить оба запроса? Какова связь между вашими двумя вышеуказанными запросами? Я не вижу
I'm using the first query result 'flowkuec8ta1o' for 2nd query
. Где вы использовали его во втором? Опубликуйте несколько образцов коллекций и результат, который вы хотите.