Mongodb 如何在数组中找到被对象包围的特定元素?
这是我在MongoDB中的文档内容。它有一个对象时间戳和许多数组Mongodb 如何在数组中找到被对象包围的特定元素?,mongodb,mongodb-query,Mongodb,Mongodb Query,这是我在MongoDB中的文档内容。它有一个对象时间戳和许多数组 { "timestamps":{ "1200":[ "390.288", "390.818", "So" ], "1175":[ "381.778", "382.248", "so" ], "1183":[ "383.668",
{
"timestamps":{
"1200":[
"390.288",
"390.818",
"So"
],
"1175":[
"381.778",
"382.248",
"so"
],
"1183":[
"383.668",
"383.928",
"a"
],
"1144":[
"372.588",
"372.718",
"up"
],
"1162":[
"377.638",
"377.928",
"rial"
],
"1218":[
"395.798",
"395.868",
"me"
],
"1145":[
"372.718",
"373.188",
"So"
]
}
}
我怎样才能找到
So
这个词,它位于1200th
索引中,它们的时间戳位于该数组的第0个索引和第1个索引中?由于您的对象键未知,您应该从运算符开始,该运算符可以将时间戳
转换为一个键和值数组,如下所示:
{
"k" : "1144",
"v" : [ "372.588", "372.718", "up"]
},
{
"k" : "1145",
"v" : [ "372.718", "373.188", "So"]
},
...
然后,您可以使用仅获取v
包含输入短语的文档。整个聚合可以如下所示:
var input = "me";
db.col.aggregate([
{
$project: {
foundElements: {
$filter: {
input: { $objectToArray: "$timestamps" },
as: "ts",
cond: { $ne: [ { $indexOfArray: [ "$$ts.v", input ] }, -1 ] }
}
}
}
},
{
$project: {
foundElements: {
$map: {
input: "$foundElements",
as: "element",
in: { $slice: [ "$$element.v", 2 ] }
}
}
}
}
])
如果数组不包含指定的短语,则返回-1
。若要重塑结果,可以使用,它将从数组中获取前两个元素(第0个和第1个)
输出:
{ "_id" : ..., "foundElements" : [ [ "395.798", "395.868" ] ] }
那么这里的预期输出是什么呢?那么,如果我在文档中找到
me
,我应该能够得到“395.798”、“395.868”
。OP的几个问题:您是在问如何仅从mongoDB返回这些值,还是如何解析从mongoDB返回的整个对象以获得这些值?此外,“So”在您的示例中匹配多个属性,但您只引用第一个属性,预期输出是否只与第一个匹配有关?最后,到目前为止,你尝试了什么?你在哪里被卡住了?如果将您现有的工作包括在内,前两个问题可能已经得到了回答。