我有一组文档,每个文档都包含一个子文档数组。每个子文档都有一个时间值。我试图看看我是否可以根据子文档中的时间返回子文档。
我知道我可以使用$ 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时间值。
可能?
去!
答案 0 :(得分:4)
正如您设计数据一样,这是不可能的。
在MongoDB中,查询返回整个文档。您可以过滤特定字段,但如果字段的值是数组,则它会在那里停止。
如果您拥有“对象数组”,则必须使用$slice
,这不是您想要的,或者您必须以不同方式对数据建模。
在您的情况下,以下结构将使您的查询成为可能:
{
_id: 1234,
type: 'a',
subs: {
'123001': { val: 'a' },
'123002': { val: 'b' },
'123003': { val: 'c' }
}
}
注意我是如何将subs
更改为JSON对象而不是数组的。现在,您可以执行以下查询,只获得您正在寻找的时间:
find( { _id: 1234 }, { 'subs.123002': 1 } )
这里明显的权衡是你必须改变你使用改变文档的方式。您无法在$push
上使用subs
,也无法查询{'subs.time': 1234}
,而是必须查询{'subs.1234': { $exists:true} }
。