如何在MongoDB数组中查询

时间:2016-01-22 20:16:40

标签: mongodb

所以,在我的MongoDB中,我有几个看起来像这样的文档:

{ 
    "_id" : ObjectId("56a17b7f5f7ecf32c5ee0077"), 
    "MediaID" : "302048", 
    "MediaName" : "El Viejo y el Mar", 
    "MediaTypeID" : "384", 
    "MediaTypeName" : "Movie", 
    "Rating" : NumberInt(0), 
    "Description" : "La versión cinematográfica de la obra inmortal de Ernest Hemingway, sobre un viejo pescador cubano que logra atrapar un pescado gigantesco que lo arrastra lejos de la orilla.", 
    "MediaWebLink" : "", 
    "Duration" : "5160", 
    "FileID" : "523852", 
    "like_counter" : NumberInt(0), 
    "EntryId" : "", 
    "Tags" : [
        {
            "Key" : "Clasificacion", 
            "Value" : "B"
        }, 
        {
            "Key" : "Genre", 
            "Value" : "Drama|Clásicas"
        }, 
        {
            "Key" : "Pais", 
            "Value" : "Estados Unidos"
        }, 
        {
            "Key" : "Directors", 
            "Value" : "John Sturges"
        }, 
        {
            "Key" : "Actors", 
            "Value" : "Spencer Tracy"
        }, 
        {
            "Key" : "Distribuidor", 
            "Value" : "Warner"
        }, 
        {
            "Key" : "Subtitles", 
            "Value" : "Español"
        }, 
        {
            "Key" : "Audio Version", 
            "Value" : "Inglés"
        }, 
        {
            "Key" : "Sub-Genre", 
            "Value" : ""
        }, 
        {
            "Key" : "Palabras Clave", 
            "Value" : ""
        }, 
        {
            "Key" : "Prizes", 
            "Value" : ""
        }
    ], 
    "Metas" : [
        {
            "Key" : "Nombre original", 
            "Value" : "The Old Man And The Sea"
        }, 
        {
            "Key" : "Synopsis corta", 
            "Value" : "Es la historia de un viejo pescador cubano que logra atrapar un pescado gigantesco que lo arrastra lejos de la orilla."
        }, 
        {
            "Key" : "Duracion", 
            "Value" : "01:26:00"
        }, 
        {
            "Key" : "Ano", 
            "Value" : "1958"
        }, 
        {
            "Key" : "Score de titulo", 
            "Value" : "4"
        }
    ], 
    "AdvertisingParameters" : [

    ] 

}

在文档中,有一个名为TAGS的数组,其中一个Key = Distribuidor和Value = Warner 我需要的是做一个查询,我可以获得所有文件的所有区别“distribuidor”值。

到目前为止,我已经尝试过这个:

db.catalogo.distinct( 'Tags.Value', { 'Tags.Key': 'Distribuidor' } )

但这给了我所有的价值,而不仅仅是“分配者”的价值。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果我理解了这个问题,试试这个,UPD:

db.catalogo.find( {}, { 'Tags.Key': 1 } )

答案 1 :(得分:0)

尝试以下aggregation pipeline

db.catalogo.aggregate({
    $unwind: "$Tags"
}, {
    $match: {
        "Tags.Key": "Distribuidor"
    }
}, {
    $group: {
        _id: "$Tags.Value"
    }
})

简而言之,我们有一个unwind,可以在多个文档中展开您的Tags数组;然后是match,过滤掉不"Distribuidor"Key的标签,然后过滤group,与Value不同在这种情况下(您可以轻松地为每个值添加count,但这不是您提出的问题)。输出类似于

{ "_id" : "Warnero" }
{ "_id" : "Warner" }