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

Fre*_*ers 7 arrays mongodb

我有一组文档,每个文档都包含一个子文档数组.每个子文档都有一个时间值.我试图看看我是否可以根据子文档中的时间返回子文档.

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

示例时间!

文件是这样的....

{ 
    id: 1234, 
    type: 'a', 
    subs: [
        { time: 123001, val: 'a' },
        { time: 123002, val: 'b' },
        { time: 123003, val: 'c' }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我使用find({},{subs:{$ slice:[2,1]}}进行查询,我会得到以下内容:

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]}
Run Code Online (Sandbox Code Playgroud)

我想检索该记录,例如不基于偏移量,而是基于123002时间值.

可能?

走!

Gat*_* VP 5

设计数据后,这是不可能的。

在MongoDB中,查询返回整个文档。您可以过滤特定的字段,但是如果字段的值是一个数组,它将在此处停止。

当您拥有“对象数组”时,要么必须$slice不是必需的,要么必须对数据进行不同的建模。

就您而言,以下结构将使您的查询成为可能:

{ 
    _id: 1234, 
    type: 'a', 
    subs: {
        '123001': { val: 'a' },
        '123002': { val: 'b' },
        '123003': { val: 'c' }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我是如何subs变成JSON对象而不是数组的。现在,您可以执行以下查询,并仅获取所需的时间:

find( { _id: 1234 }, { 'subs.123002': 1 } )
Run Code Online (Sandbox Code Playgroud)

这里明显的权衡是您将不得不更改更改文档的使用方式。您不能使用$pushon subs,也不能查询{'subs.time': 1234},而必须查询{'subs.1234': { $exists:true} }