Arrays MongoDB查询,通过数组中的值检索一个数组值
我有一个文档集合,每个文档都包含一系列子文档。每个子文档都有一个时间值。我正在尝试根据子文档中的时间返回子文档 我知道我可以使用$slice检索子文档,但是$slice只给我一个特定的索引或范围和偏移量 示范时间 文件是这样的Arrays MongoDB查询,通过数组中的值检索一个数组值,arrays,mongodb,Arrays,Mongodb,我有一个文档集合,每个文档都包含一系列子文档。每个子文档都有一个时间值。我正在尝试根据子文档中的时间返回子文档 我知道我可以使用$slice检索子文档,但是$slice只给我一个特定的索引或范围和偏移量 示范时间 文件是这样的 { id: 1234, type: 'a', subs: [ { time: 123001, val: 'a' }, { time: 123002, val: 'b' }, { time: 12
{
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如果应用程序代码强制执行键的顺序,您可以控制键的顺序。