我正在使用mongoose使用以下方案查询MongoDB:
var File = mongoose.model('File',{
size: Number,
type: String,
filename: String,
path: String,
taxonomies:[{
tags:[{
name:String,
'tag':String
}],
name: String
}]
});
现在我想按如下方式进行不同的查询:
File.distinct('taxonomies.tags.tag', {'taxonomies.name':'AM'},function(error, tags){
if(err)
res.send(err);
console.log("All distinct tags", tags);
})
从所有分类名称为“AM”的文件中获取所有唯一标记。问题是上面的查询返回所有标签,包括具有不同taxonomies.name的标签。没有条件,它就可以正常工作。
我在这里有语法错误,还是我误解了有多么独特?
更新(更多示例) 每个文档都有一个名称为SM的分类法和一个名称为AM的分类法,类似于
taxonomies: [{
tags: [
{
name:"Type",
'tag':kind
}, {
name:"Language",
'tag':lang
},
{
name:"Code",
"tag":code
}],
name:'AM'
}, {
name:'SM',
tags:[{
name:"Sales",
'tag':'has to be sold'
},{
name:"Personal filter",
'tag':'temp'
}]
}]
当我执行上面提到的查询时,我得到了结果:
所有不同的标签['4007','fr','必须出售','temp','wol','16104','en']
虽然'temp'和'必须出售'来自SM,而不是AM。
我想要的结果只是我们所有文件中的taxonomies.name ='AM',没有重复
答案 0 :(得分:1)
查询选择是选择文档,而不是数组中的元素:
{'taxonomies.name':'AM'}
该标准将选择整个文档。
因此,两个数组中的所有项都被视为对distinct
操作有效。如果您只想要考虑子集,则需要使用聚合框架来过滤或修改您的文档,以便两个分类法不会存储在同一文档中。
如果您使用聚合框架而不是distinct
命令,则可以使用许多选项来收集不同的值:
db.test.aggregate({$unwind: "$taxonomies" },
{ $group :
{ _id: "$taxonomies.name",
tags: { $addToSet: "$taxonomies.tags" } }} )
应该对SM
和AM
(以及其他任何人)进行分组:
[
{
"_id" : "SM",
"tags" : [
[
"d1",
"e1"
],
[
"d",
"e"
]
]
},
{
"_id" : "AM",
"tags" : [
[
"a1",
"b1",
"c1"
],
[
"a",
"b",
"c"
]
]
}
]
您也可以使用$match
过滤特定的name
。