mongodb查询以获取与数组内的元素匹配的文档,并且不应与另一个数组中的元素匹配

时间:2017-01-19 23:59:44

标签: mongodb mongodb-query

您好我有产品表及其数据如下所示

{ 
"_id" : ObjectId("5870f1d9dd0ef6e62102e6ad"), 
"type" : "product", 
"product_name" : "product1", 
"created_date" : "2016-10-06 19:36:30", 
"display_areas" : [
    {
        "area" : "area1", 
        "order" : "11", 
        "price" : 10.0
    }, 
    {
        "area" : "area2", 
        "order" : "11", 
        "valid" : 11.0
    }
], 
"user_deleted" : [
    {
        "area" : "area1", 
        "user" : "user1"
    }, 
    {
        "area" : "area1", 
        "user" : "user2"
    }
]
}
{ 
"_id" : ObjectId("5870f1d9dd0ef6e62102e6ad"), 
"type" : "product", 
"product_name" : "product2", 
"created_date" : "2016-10-06 19:36:30", 
"display_areas" : [
    {
        "area" : "area1", 
        "order" : "11", 
        "price" : 10.0
    }, 
    {
        "area" : "area2", 
        "order" : "11", 
        "valid" : 11.0
    }
]
}

一般情况下,我想基于display_areas显示这些产品,我可以使用展开选项轻松地进行查询。但我想基于display_areas将它们显示给特定用户,而display_areas不会被用户删除。

在上面的示例中如果我必须在area1中显示user1的产品,我应该只获取product2的信息。因为,user1删除了product1的area1。

这是这种查询的最佳数据库结构吗?我也对结构的任何建议持开放态度。

提前致谢。

1 个答案:

答案 0 :(得分:1)

这是一个浮现在脑海中的想法。您可以将user移动到users数组中的display_areas数组中,然后移除user_deleted数组。因此,product1的新结构如下所示。

{
    "_id": ObjectId("5870f1d9dd0ef6e62102e6ad"),
    "type": "product",
    "product_name": "product1",
    "created_date": "2016-10-06 19:36:30",
    "display_areas": [{
        "area": "area1",
        "order": "11",
        "price": 10.0,
        "users" : ["user1", "user2"]
    }, {
        "area": "area2",
        "order": "11",
        "valid": 11.0
    }]
}

现在可以使用elemMatch轻松查询结构。这样的事情。

db.collection.find({"display_areas":{"$elemMatch":{"area": "area1", "users":{$ne:"user1"}}}})