mongodb - Mongodb-Query db 使用来自另一个查询的结果
问题描述
我对同一个集合有多个查询:
第一个查询:
db.getCollection('messagelogs').find({'intents.intent':'General_Positive_Feedback'},{'currentStep':1,'_id':0})
第一次查询结果
{
"currentStep" : [
"flowkuec8ta1o"
]
}
我将第一个查询结果“flowkuec8ta1o”用于第二个查询(查询 1 结果中的“currentStep”用作以下第二个查询中键“previousStep”的值):
第二个查询:
db.getCollection('messagelogs').find({'previousStep':'flow1pemwl7ws'},{'userMessage':1})
第二次查询结果:
{
"_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(其中从查询 1 获取的“currentStep”值在第二个查询中用作“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"
}]
}
以下文档与第二个查询匹配(其中“previousStep”与从第一个查询获取的“currentStep”匹配)
文档 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!"
}
解决方案
您可以使用以下聚合
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"
}}
])
推荐阅读
- python - Python没有完全解压snappy parquet
- r - 数据帧值之间的差异
- vue.js - 如何根据 vuetify 中的条件使用 v-simple-table 计算列中的数据总数?
- apache-kafka - flink并行和kafka分区在生产数据上有什么关系?
- azure - Azure Purview - ADLS2 中已删除的文件夹
- java - 尝试将用户输入的字符串从一个类用于Java中的另一个类
- azure - Azure CDN 标准规则引擎中的小写传入 url
- java - 如何将 XML 元素的全部内容解析为 java 中的对象
- azure-data-explorer - Kusto:是否可以为来自特定表的列添加前缀?
- terraform - 如何引用`main.tf`中的变量?