猫鼬明显的条件不起作用

时间:2014-01-31 11:56:59

标签: javascript node.js mongodb mongoose

我正在使用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',没有重复

1 个答案:

答案 0 :(得分:1)

查询选择是选择文档,而不是数组中的元素:

{'taxonomies.name':'AM'}

该标准将选择整个文档。

因此,两个数组中的所有项都被视为对distinct操作有效。如果您只想要考虑子集,则需要使用聚合框架来过滤或修改您的文档,以便两个分类法不会存储在同一文档中。

如果您使用聚合框架而不是distinct命令,则可以使用许多选项来收集不同的值:

db.test.aggregate({$unwind: "$taxonomies" },  
      { $group : 
          {  _id: "$taxonomies.name", 
             tags: { $addToSet: "$taxonomies.tags" } }} )

应该对SMAM(以及其他任何人)进行分组:

 [
     {
             "_id" : "SM",
             "tags" : [
                     [
                             "d1",
                             "e1"
                     ],
                     [
                             "d",
                             "e"
                     ]
             ]
     },
     {
             "_id" : "AM",
             "tags" : [
                     [
                             "a1",
                             "b1",
                             "c1"
                     ],
                     [
                             "a",
                             "b",
                             "c"
                     ]
             ]
     }
]

您也可以使用$match过滤特定的name