这是我在MongoDB中的文档内容。它有一个对象时间戳和很多数组。
{
"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个索引中?
答案 0 :(得分:1)
由于未知对象键,因此应以$objectToArray运算符开头,该运算符可以将timestamps
转换为键和值的数组,如下所示:
{
"k" : "1144",
"v" : [ "372.588", "372.718", "up"]
},
{
"k" : "1145",
"v" : [ "372.718", "373.188", "So"]
},
...
然后,您可以使用$filter仅获取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 ] }
}
}
}
}
])
如果数组不包含指定的短语,则 $indexOfArray返回-1
。要重塑结果,您可以将$map与$slice结合使用,这将从数组中的前两个元素开始(第0个和第1个)。
输出:
{ "_id" : ..., "foundElements" : [ [ "395.798", "395.868" ] ] }