gpt4 book ai didi

javascript - javascript中的嵌套MongoDB查询

转载 作者:可可西里 更新时间:2023-11-01 10:36:14 26 4
gpt4 key购买 nike

这是一个 GraphQL 解析器。问题在于使用 async/await 的 promise 处理。

我尝试过实现 promise 处理,但我无法以正确的方式设置它,我在 promise 处理方面没有太多经验,一些学习资料会有很大帮助。

我的理解是脚本将在调用 await 的地方停止,并在 await 调用完成后继续。但它绕过了等待。返回值后等待调用完成

    allDocs: async (args, context) => context().then(async client => {
let db = client.db(dbName)
const id = args.identifier.trim()
let nameArr = []
return await db.collection("collection").find({
$or: [{
"a.iden": id
}, {
"b.iden": id
}]
}).toArray().then(async (arr) => {
let year
arr.map(async element => {
let pmcid = element.pmc_id.toUpperCase()
try {
year = await db.collection("Another_collection").findOne({"pmcid" : query})["year"]
} catch (e) {
year = null
}
element["publication_year"] = year
})
return await arr
}).then((arr)=>{
client.close()
return {
"documents": arr,
"count": arr.length,
"searchkey": id
}
})
}),

预期的返回值应该有“publication_year”作为某个年份,现在它给 null。

感谢帮助

最佳答案

您似乎将 Promises 与 async/await 混合在一起,这有点难以理解。始终最好通过将 Promise 位更改为使用 async/await 来分解您的代码,因为这将帮助您缩小问题范围。您也可以将整个 block 包装在 try/catch 中,这样可以相对轻松地处理同步和异步错误。

因此,首先,您可以更改上下文函数调用,它会返回使用 async await 的 promise

allDocs: async (args, context) => {
try {
const client = await context()

....
} catch(err) {

}
}

然后对 toArray() 函数调用执行相同操作,该函数调用返回一个可以使用 async/await 解决的 promise :

allDocs: async (args, context) => {
try {
const client = await context()
const db = client.db(dbName)
const id = args.identifier.trim()
const results = await db.collection('collection').find({
'$or': [
{ 'a.iden': id },
{ 'b.iden': id }
]
}).toArray()

const arr = results.map(async doc => {
const pmcid = doc.pmc_id.toUpperCase()
const { year } = await db.collection('Another_collection')
.findOne({'pmcid' : pmcid })

return {
...doc,
publication_year: year
}
})

client.close()

return {
'documents': arr,
'count': arr.length,
'searchkey': id
}
} catch(err) {
// handle error
}
}

调用其他集合以获取 publication_year 可以在单个调用中使用 $lookup 管道而不是在 map 循环中完成。考虑以下管道

allDocs: async (args, context) => {
try {
const client = await context()
const db = client.db(dbName)
const id = args.identifier.trim()
const pipeline = [
{ '$match': {
'$or': [
{ 'a.iden': id },
{ 'b.iden': id }
]
} },
{ '$lookup': {
'from': 'Another_collection',
'let': { 'pmcId': '$pmc_id' },
'pipeline': [
{ '$match': {
'$expr': {
'$eq': [
'$pmcid',
{ '$toUpper': '$$pmcId' }
]
}
} }
],
'as': 'pmc'
} },
{ '$addFields': {
'publication_year': {
'$arrayElemAt': [ '$pmc.year', 0 ]
}
} },
{ '$project': { 'pmc': 0 } }
]
const arr = await db.collection('collection').aggregate(pipeline).toArray()

client.close()

return {
'documents': arr,
'count': arr.length,
'searchkey': id
}
} catch(err) {
// handle error
}
}

关于javascript - javascript中的嵌套MongoDB查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com