我有这样的查询:
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
时,我必须根据模式按顺序查询事物?
答案 0 :(得分:1)
尝试使用find
代替。它返回游标,因此您可以使用skip
和limit
方法:
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)
显然,我需要翻转查询并按照在架构中定义的顺序搜索事物。