Mongodb聚合匹配数组项与子数组项

时间:2014-03-05 16:30:48

标签: mongodb

我想找到包含子数组中特定值的文档。

这是一个示例文档:

{
"_id" : ObjectId("52e9658e2a13df5be22cf7dc"),
"desc" : "Something somethingson",
"imageurl" : "http://",
"tags" : [ 
    {
        "y" : 29.3,
        "brand" : "52d2cecd0bd1bd844d000018",
        "brandname" : "Zara",
        "type" : "Bow Tie",
        "x" : 20,
        "color" : "52d50c19f8f8ca8448000001",
        "number" : 0,
        "season" : 0,
        "cloth" : "52d50d57f8f8ca8448000006"
    },
    {
        "y" : 29.3,
        "brand" : "52d2cecd0bd1bd844d000018",
        "brandname" : "Zara",
        "type" : "Bow Tie",
        "x" : 20,
        "color" : "52d50c19f8f8ca8448000001",
        "number" : 0,
        "season" : 0,
        "cloth" : "52d50d57f8f8ca8448000006"
    }
],
"user_id" : "52e953942a13df5be22cf7af",
"username" : "Thompson",
"created" : 1386710259971,
"occasion" : "ID",
"sex" : 0
}

我想做的查询应该是这样的:

db.posts.aggregate([
        {$match: {tags.color:"52d50c19f8f8ca8448000001", tags.brand:"52d2cecd0bd1bd844d000018", occasion: "ID"}},
        {$sort:{"created":-1}},
        {$skip:0},
        {$limit:10}
    ])

我的问题是我不知道如何匹配文档中数组中的任何内容,如“tags”。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

您可以尝试在没有聚合框架的情况下执行此操作:

db.posts.find(
{
    occasion: "ID", 
    tags: { $elemMatch: { color:"52d50c19f8f8ca8448000001", brand:"52d2cecd0bd1bd844d000018" } } 
}
).sort({created: -1}).limit(10)

如果你想使用聚合:

db.posts.aggregate([
    {$match: 
        {
            tags: { $elemMatch: { color:"52d50c19f8f8ca8448000001", brand: "52d2cecd0bd1bd844d000018" } },
            occasion: "ID"
        }
    },
    {$sort:{"created":-1}},
    {$limit:10}
])