gpt4 book ai didi

Mongodb 在子数组中查找

转载 作者:太空狗 更新时间:2023-10-30 01:44:06 27 4
gpt4 key购买 nike

我有一个这样设置的文档:

{
_id : ObjectId(),
info : [
[
1399583281000,
20.13
],
[
1399583282000,
20.13
],
[
1399583283000,
20.13
],
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}

此数据可能分布在多个文档中。一般来说,每个文档包含59个周期(秒)的信息数据。

我想做的是获取时间戳大于特定时间的所有信息数据。

有什么想法可以实现吗?

谢谢

编辑:

所以,我发现这似乎返回了所有文档:

db.infos.find({
info:{
$elemMatch:{
0:{
$gt:1399583306000
}
}
}
})

但也许我需要在聚合查询中使用它?以便它只返回所有值?

最佳答案

你在正确的轨道上,但这里有几点需要注意,除了嵌套数组(尤其是匿名键)并不是存储东西的好方法,但只要你始终知道那么这个位置应该是合理的。

匹配文档和匹配“数组元素”之间有明显的区别。虽然您的当前值实际上不匹配(您的搜索值不在文档的范围内),但如果该值实际上有效,您的查询正确匹配此处的“文档”,其中包含一个匹配元素在数组中。

“文档” 包含所有数组元素,即使是那些不匹配的元素,但条件表示“文档”确实匹配,所以它被返回。如果您只想要匹配的“元素”,那么使用.aggregate()相反:

    db.infos.aggregate([
// Still match the document
{ "$match": {
"info": {
"$elemMatch": { "0": {"$gte": 1399583285000} }
}
}},

// unwind the array for the matched documents
{ "$unwind": "$info" },

// Match only the elements
{ "$match": { "info.0": { "$gte": 1399583285000 } } },

// Group back to the original form if you want
{ "$group": {
"_id": "$_id",
"info": { "$push": "$info" }
}}

])

然后只返回符合条件的元素:

{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}

或者当然,如果您只希望匹配一个 元素,那么您可以简单地将投影与 一起使用。 .find()** :

db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)

但是使用类似 $gt 的术语您可能会在文档中获得多次点击,因此考虑到 positional $,聚合方法会更安全。运算符只会返回第一个 匹配项。

关于Mongodb 在子数组中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553922/

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