如何让findOne返回一个元素?

时间:2014-03-21 21:03:11

标签: javascript mongodb mongoose

我有这样的查询:

customers.findOne({name:'X','files.author':'c','files.name':'d'},{'files.$':1},function(err,data2){...

我的数据是这样的:

{
    name:"X"
    files:[
       {name:"b"
        author:"a"}
       {name:"d"
       author:"c"}
    ]
}

显然,如果我这样做

返回files[0]。我想要files[1]。我怎样才能做到这一点?这段代码是否应该这样做,因此,我的错误在其他地方?

编辑:

显然, 如果我{name:'X','files.name':'d','files.author':'c'}它会工作。

如果我做{name:'X','files.author':'c','files.name':'d'}则不会。

我的架构也被颠倒了。我做了一个编辑来反映这一点。实际上,name定义在author之上。因此,当使用Mongoose的findOne时,我必须根据模式按顺序查询事物?

3 个答案:

答案 0 :(得分:1)

尝试使用find代替。它返回游标,因此您可以使用skiplimit方法:

customers.find({...}).skip(1).limit(1);

答案 1 :(得分:1)

如果要匹配相同数组元素中的多个字段,则需要使用$elemMatch而不是单独列出它们:

customers.findOne(
    {name: 'X', files: {$elemMatch: {author: 'c', name: 'd'}}},
    {'files.$':1},
    function(err, data2) {...

当您单独列出时,它们可以匹配不同的files数组元素。

答案 2 :(得分:0)

显然,我需要翻转查询并按照在架构中定义的顺序搜索事物。