Arrays MongoDB查询,通过数组中的值检索一个数组值

Arrays MongoDB查询,通过数组中的值检索一个数组值,arrays,mongodb,Arrays,Mongodb,我有一个文档集合,每个文档都包含一系列子文档。每个子文档都有一个时间值。我正在尝试根据子文档中的时间返回子文档 我知道我可以使用$slice检索子文档,但是$slice只给我一个特定的索引或范围和偏移量 示范时间 文件是这样的 { id: 1234, type: 'a', subs: [ { time: 123001, val: 'a' }, { time: 123002, val: 'b' }, { time: 12

我有一个文档集合,每个文档都包含一系列子文档。每个子文档都有一个时间值。我正在尝试根据子文档中的时间返回子文档

我知道我可以使用$slice检索子文档,但是$slice只给我一个特定的索引或范围和偏移量

示范时间

文件是这样的

{ 
    id: 1234, 
    type: 'a', 
    subs: [
        { time: 123001, val: 'a' },
        { time: 123002, val: 'b' },
        { time: 123003, val: 'c' }
    ]
}
如果我使用find({},{subs:{$slice:[2,1]}})进行查询,我会得到如下结果:

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]}
我想检索该记录,例如,不是基于偏移量,而是基于123002时间值

可能吗


由于您已经设计了数据,因此这是不可能的

在MongoDB中,查询返回整个文档。您可以筛选特定字段,但如果字段的值是数组,它将停止在那里

当您拥有“对象数组”时,您要么必须
$slice
,这不是您想要的,要么必须以不同的方式对数据进行建模

在您的情况下,以下结构将使您的查询成为可能:

{ 
    _id: 1234, 
    type: 'a', 
    subs: {
        '123001': { val: 'a' },
        '123002': { val: 'b' },
        '123003': { val: 'c' }
    }
}
注意我是如何将
subs
更改为JSON对象而不是数组的。现在,您可以执行以下查询并仅获取您要查找的时间:

find( { _id: 1234 }, { 'subs.123002': 1 } )

这里的一个明显的折衷是,您必须更改使用文档的方式。您不能在
subs
上使用
$push
,您不能查询
{'subs.time':1234}
,而是必须查询
{'subs.1234':{$exists:true}

!是的,那会有用的。非常感谢。除非我误解了你的意思,否则你可以退回部分文件。。只是不使用切片就不是数组的一部分。谢谢如果使用原始结构,可以执行
'subs.2'
来获取数组中的第三个元素。但是你通常不知道第三项是什么。所以对于数组,通常是全有或全无。这个问题很老了,但也许这对寻找答案的人很有用。可以将数组中的一个文档与$elemMatch匹配<代码>$elemMatch虽然并不完美。上次我玩这个游戏时,顺序很重要:
{“$elemMatch”:{shape:“square”,color:“purple”}
!=<代码>{“$elemMatch”:{颜色:“紫色”,形状:“方形”}。这真的很差劲,因为您无法控制键的顺序。@GatesVP如果应用程序代码强制执行键的顺序,您可以控制键的顺序。