gpt4 book ai didi

node.js - 与数组相比,如何检索 mongodb 中嵌入文档的一部分?

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:46 25 4
gpt4 key购买 nike

我想得到与 arr 值匹配的特定问题。我尝试了 $where,$in $projection 但不起作用。这里 in 运算符只给出一个问题,即问题 1 意味着它在 arr 中找到问题 1,当找到时它只返回该问题,但我想要与数组中其他值相对应的问题。请帮忙。

 var arr=["3","1","5","2","4"];
db.exammasters.find({'examid':"1026","questionMaster.questionNo":{$in:["3","1","5","2","4"]}},{_id: 0, questionMaster: {$elemMatch:{questionNo:{$in:["3","1","5","2","4"]}}},'questionMaster.answer':0})

这是我的文档

{

"_id": "5649e095b945ebd412000046",
"examid": "1026",
"name": "C++",
"description": "C++ exam",
"questionLimit": 5,
"examDuration": 5,
"__v": 0,
"questionMaster": [
{
"questionNo": "1",
"questionText": "Is bool a fundamental datatype in C++?",
"answer": "5149532885f5543cb3dc7865c1b41b6a",
"_id": "5649e095b945ebd41200007a",
"Options": [
{
"optionNo": "1",
"optionText": "Yes",
"_id": "5649e095b945ebd41200007e"
},
{
"optionNo": "2",
"optionText": "No, it is a typedef of unsigned char",
"_id": "5649e095b945ebd41200007d"
},
{
"optionNo": "3",
"optionText": "No, it is an enum of {false,true}",
"_id": "5649e095b945ebd41200007c"
},
{
"optionNo": "4",
"optionText": "No, it is expanded from macros",
"_id": "5649e095b945ebd41200007b"
}
]
},
{
"questionNo": "2",
"questionText": "Find the odd one out:",
"answer": "6e4fc780d5604c5160f859df934436fb",
"_id": "5649e095b945ebd412000075",
"Options": [
{
"optionNo": "1",
"optionText": "std::vector<int>",
"_id": "5649e095b945ebd412000079"
},
{
"optionNo": "2",
"optionText": " std::vector<short>",
"_id": "5649e095b945ebd412000078"
},
{
"optionNo": "3",
"optionText": " std::vector<long>",
"_id": "5649e095b945ebd412000077"
},
{
"optionNo": "4",
"optionText": "std::vector<bool>",
"_id": "5649e095b945ebd412000076"
}
]
},
{
"questionNo": "3",
"questionText": " What happens when a null pointer is converted into bool?",
"answer": "4277f0f85e152d162d9433a63f8cf5de",
"_id": "5649e095b945ebd412000070",
"Options": [
{
"optionNo": "1",
"optionText": "An error is flagged",
"_id": "5649e095b945ebd412000074"
},
{
"optionNo": "2",
"optionText": "bool value evaluates to true",
"_id": "5649e095b945ebd412000073"
},
{
"optionNo": "3",
"optionText": "bool value evaluates to false",
"_id": "5649e095b945ebd412000072"
},
{
"optionNo": "4",
"optionText": " the statement is ignored",
"_id": "5649e095b945ebd412000071"
}
]
},
{
"questionNo": "4",
"questionText": "Which of the following statements are false?",
"answer": "eaf0eec3ced4c8f4945ac3e1312ba84f",
"_id": "5649e095b945ebd41200006b",
"Options": [
{
"optionNo": "1",
"optionText": " bool can have two values and can be used to express logical expressions",
"_id": "5649e095b945ebd41200006f"
},
{
"optionNo": "2",
"optionText": "bool cannot be used as the type of the result of the function.",
"_id": "5649e095b945ebd41200006e"
},
{
"optionNo": "3",
"optionText": " bool can be converted into integers implicitly",
"_id": "5649e095b945ebd41200006d"
},
{
"optionNo": "4",
"optionText": " a bool value can be used in arithemetic expressions.",
"_id": "5649e095b945ebd41200006c"
}
]
},
{
"questionNo": "5",
"questionText": " For what values of the expression is an if-statement block not executed?",
"answer": "eaf0eec3ced4c8f4945ac3e1312ba84f",
"_id": "5649e095b945ebd412000068",
"Options": [
{
"optionNo": "1",
"optionText": " 0 and all negative values",
"_id": "5649e095b945ebd41200006a"
},
{
"optionNo": "2",
"optionText": "0",
"_id": "5649e095b945ebd412000069"
}
]
},
{
"questionNo": "6",
"questionText": "A pointer is",
"answer": "6e4fc780d5604c5160f859df934436fb",
"_id": "5649e095b945ebd412000063",
"Options": [
{
"optionNo": "1",
"optionText": "A keyword used to create variables",
"_id": "5649e095b945ebd412000067"
},
{
"optionNo": "2",
"optionText": "A variable that stores address of an instruction",
"_id": "5649e095b945ebd412000066"
},
{
"optionNo": "3",
"optionText": "A variable that stores address of other variable",
"_id": "5649e095b945ebd412000065"
},
{
"optionNo": "4",
"optionText": "All of the above",
"_id": "5649e095b945ebd412000064"
}
]
},
{
"questionNo": "7",
"questionText": "Which of the two operators ++ and — work for the bool datatype in C++?",
"answer": "eaf0eec3ced4c8f4945ac3e1312ba84f",
"_id": "5649e095b945ebd41200005e",
"Options": [
{
"optionNo": "1",
"optionText": "None",
"_id": "5649e095b945ebd412000062"
},
{
"optionNo": "2",
"optionText": "++",
"_id": "5649e095b945ebd412000061"
},
{
"optionNo": "3",
"optionText": "--",
"_id": "5649e095b945ebd412000060"
},
{
"optionNo": "4",
"optionText": "both",
"_id": "5649e095b945ebd41200005f"
}
]
},
{
"questionNo": "8",
"questionText": " The size_t integer type in C++ is?",
"answer": "4277f0f85e152d162d9433a63f8cf5de",
"_id": "5649e095b945ebd41200005a",
"Options": [
{
"optionNo": "1",
"optionText": "Unsigned integer of at least 64 bits",
"_id": "5649e095b945ebd41200005d"
},
{
"optionNo": "2",
"optionText": "Signed integer of at least 16 bits",
"_id": "5649e095b945ebd41200005c"
},
{
"optionNo": "3",
"optionText": "Unsigned integer of at least 16 bits",
"_id": "5649e095b945ebd41200005b"
}
]
},
{
"questionNo": "9",
"questionText": " Which of these expressions will return true if the input integer v is a power of two?",
"answer": "4277f0f85e152d162d9433a63f8cf5de",
"_id": "5649e095b945ebd412000056",
"Options": [
{
"optionNo": "1",
"optionText": " (v | (v + 1)) == 0;",
"_id": "5649e095b945ebd412000059"
},
{
"optionNo": "2",
"optionText": "(v | (v – 1)) == 0;",
"_id": "5649e095b945ebd412000058"
},
{
"optionNo": "3",
"optionText": "(v & (v – 1)) == 0;",
"_id": "5649e095b945ebd412000057"
}
]
},
{
"questionNo": "10",
"questionText": "How does a sequence of objects are accessed in c++?",
"answer": "4277f0f85e152d162d9433a63f8cf5de",
"_id": "5649e095b945ebd412000051",
"Options": [
{
"optionNo": "1",
"optionText": "Iterators",
"_id": "5649e095b945ebd412000055"
},
{
"optionNo": "2",
"optionText": "Pointers",
"_id": "5649e095b945ebd412000054"
},
{
"optionNo": "3",
"optionText": "Both a & b",
"_id": "5649e095b945ebd412000053"
},
{
"optionNo": "4",
"optionText": " None of the mentioned",
"_id": "5649e095b945ebd412000052"
}
]
},
{
"questionNo": "11",
"questionText": "How many parameters are present in mismatch method in non-sequence modifying algorithm?",
"answer": "6e4fc780d5604c5160f859df934436fb",
"_id": "5649e095b945ebd41200004c",
"Options": [
{
"optionNo": "1",
"optionText": "1",
"_id": "5649e095b945ebd412000050"
},
{
"optionNo": "2",
"optionText": "2",
"_id": "5649e095b945ebd41200004f"
},
{
"optionNo": "3",
"optionText": "3",
"_id": "5649e095b945ebd41200004e"
},
{
"optionNo": "4",
"optionText": "4",
"_id": "5649e095b945ebd41200004d"
}
]
},
{
"questionNo": "12",
"questionText": "What will happen in ‘all_of’ method if the range is empty?",
"answer": "5149532885f5543cb3dc7865c1b41b6a",
"_id": "5649e095b945ebd412000047",
"Options": [
{
"optionNo": "1",
"optionText": "Return true",
"_id": "5649e095b945ebd41200004b"
},
{
"optionNo": "2",
"optionText": "Return false",
"_id": "5649e095b945ebd41200004a"
},
{
"optionNo": "3",
"optionText": "Return nothing",
"_id": "5649e095b945ebd412000049"
},
{
"optionNo": "4",
"optionText": "None of the mentioned",
"_id": "5649e095b945ebd412000048"
}
]
}
],
"instructionsDetails": [
{
"_id": "5649e095b945ebd41200007f",
"Instructions": [
{
"instructionNo": "1",
"instruction": "This is C++ Exam Quiz Conducted by Esko",
"_id": "5649e095b945ebd412000081"
},
{
"instructionNo": "2",
"instruction": "Follow Rules and regulations",
"_id": "5649e095b945ebd412000080"
}
]
}
]
}
]

最佳答案

从版本 3.2 开始,您可以使用 $filter运算符返回一个仅包含与您的条件匹配的元素的数组。

var myArray = [ "3", "1", "5", "2", "4" ];

db.collection.aggregate([
{ "$match": {
"examid": "1026",
"questionMaster.questionNo": { "$in": myArray }
}},
{ "$project": {
"name": 1,
"examid": 1,
"description": 1,
"questionLimit": 1,
"examDuration": 1,
"__v": 1,
"questionMaster": {
"$filter": {
"input": "$questionMaster",
"as": "question",
"cond": {
"$setIsSubset": [
{ "$map": {
"input": { "$literal": [ "Q" ] },
"as": "q",
"in": "$$question.questionNo"
}},
myArray
]
}
}
}
}}
])
<小时/>

在 MongoDB 3.2 之前,您需要使用 $match 来过滤文档。运算符(operator)。管道的下一阶段是 $redact阶段,您使用 $cond 仅检索数组中“questionNo”所在的文档表达。因为您无法在 $cond 中使用 $in 运算符,所以您需要使用 $setIsSubset如果您的“questionNo”出现在数组中,则返回 true 的运算符。但问题是 $setIsSubset 需要两个数组,因此要使其工作,您需要使用 $map运算符(operator)。当然 $map 输入必须是解析为数组的表达式,并且因为“questionNo”不是您需要使用 $literal 的数组运算符。

var myArray = [ "3", "1", "5", "2", "4" ];

db.collection.aggregate([
{ "$match": {
"examid": "1026",
"questionMaster.questionNo": { "$in": myArray }
}},
{ "$redact": {
"$cond": [
{ "$or": [
{ "$setIsSubset": [
{ "$map": {
"input": { "$literal": [ "Q" ] },
"as": "q", "in": "$questionNo"
}},
myArray
] },
{ "$not": "$questionNo" }
]},
"$$DESCEND",
"$$PRUNE"
]
}}
])

关于node.js - 与数组相比,如何检索 mongodb 中嵌入文档的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036401/

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