gpt4 book ai didi

mongodb - 如果没有, Mongoose 只从数组或空数组中获取特定对象

转载 作者:行者123 更新时间:2023-12-04 10:05:36 29 4
gpt4 key购买 nike

所以我有一个 问卷模型:

const schema = new mongoose.Schema({
title: String,
category: String,
description: String,
requirementOption: String,
creationDate: String,
questions: [],
answers: []
})

如您所见,答案是一个数组。此数组包含具有此结构的对象
{
"participantEmail": "someEmail@email.email"
"currentIndex": 14,
...
}

现在我想通过 id 获得特定的问卷,但在答案数组中我只想要特定的参与者电子邮件。所以答案数组应该有一个元素或没有元素。但我不想得到 null如果答案数组中没有这样的电子邮件,则结果。

我弄清楚如何使用此查询从数组中获取该特定元素:
dbModel.findOne({_id: id, 'answers': {$elemMatch: {participantEmail: "someEmail@email.com"}}}, {'answers.$': 1}).exec();

如果该电子邮件存在于答案数组中,我将得到以下信息:
 "data": {
"questionnaireForParticipant": {
"id": "5d9ca298cba039001b916c55",
"title": null,
"category": null,
"creationDate": null,
"description": null,
"questions": null,
"answers": [
{
"participantEmail": "someEmail@email.com",
....
}

}
}

但如果该电子邮件不在答案数组中,我将只会收到 null .我也想得到 titlecategory以及所有其他领域。但我似乎找不到办法做到这一点。

最佳答案

既然你有这种情况 'answers': {$elemMatch: {participantEmail: "someEmail@email.com"}}.findOne() 的过滤器部分- 如果给定 _id文档 answers. participantEmail 中没有元素数组与输入值匹配 "someEmail@email.com"然后 .findOne()将返回 null作为输出。因此,如果您想在不考虑 answers 中是否存在匹配元素的情况下返回文档数组与否然后尝试以下查询:

db.collection.aggregate([
{
$match: { "_id": ObjectId("5a934e000102030405000000") }
},
/** addFields will re-create an existing field or will create new field if there is no field with same name */
{
$addFields: {
answers: {
$filter: { // filter will result in either [] or array with matching elements
input: "$answers",
cond: { $eq: [ "$$this.participantEmail", "someEmail@email.com" ] }
}
}
}
}
])

测试: mongoplayground

引用: aggregation-pipeline

注意:我们使用了聚合,因为您想返回 answers具有匹配元素的数组或空数组。您也可以使用 $project而不是 $addFields根据需要转换输出。

关于mongodb - 如果没有, Mongoose 只从数组或空数组中获取特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61603590/

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