【问题标题】:Unusual Mongo DB Query异常的MongoDB查询
【发布时间】:2016-12-09 03:14:08
【问题描述】:

我需要做一个特殊的查询。我有一份可用于生产的物品清单。使用这些数据,我需要查询列表中每种类型的项目所在的文档。一些(稍微)简单化的 Document 看起来可能是这样的。

{

    "productname": "iron",
    "requirements": [
        {
            "ammount": 2,
            "item": "coal"
        },
        {
            "ammount": 2,
            "item": "ironore"
        }
    ],
}

{

    "productname": "coal",
    "requirements": [
        {
            "ammount": 2,
            "item": "wood"
        }
    ],
}

{

    "productname": "copper",
    "requirements": [
        {
            "ammount": 2,
            "item": "coal"
        },
        {
            "ammount": 2,
            "item": "copperore"
        }
    ],
}

{

    "productname": "Chair",
    "requirements": [
        {
            "ammount": 2,
            "item": "wood"
        },
        {
            "ammount": 2,
            "item": "nails"
        },
        {
            "ammount": 2,
            "item": "paint"
        }
    ],
}
{

    "productname": "Wooden Toy",
    "requirements": [
        {
            "ammount": 2,
            "item": "wood"
        },
        {
            "ammount": 2,
            "item": "paint"
        }
    ],
}

示例列表可能如下所示: [“木头”、“啤酒”、“煤”、“油漆”、“铜矿”]

这应该返回“煤炭”、“铜”和“木制玩具”的文件,因此它们的所有要求都在列表中。 “Chair”缺少“钉子”,“Iron”缺少“Ironore”。

(对不起,我的英语不好;))

【问题讨论】:

  • 你能详细说明specialunusual是什么吗?
  • 我认为不是我的查询的所有部分都需要匹配但目标文档中的所有要求都需要满足是不寻常的。可能我解释得不够清楚。
  • 那么让我们看看我是否理解:您有一个要求列表,比如说[element1, element2, element4],并且您想要所有具有所有这些要求的文档?例如,他们有[element1, element2, element3, element4]?
  • 不,我有一个清单,里面有我存储的东西,大概有 100 件左右。我得到了 MongoDB 和我可以生产的东西,请参阅上面的示例文档。现在我想知道基本上可以生产什么东西。 (可以忽略 ammount)所以我想获取存储列表中列出的所有要求的所有文档。
  • 如果您提供一组示例输入和预期输出来说明可能的情况(在问题本身中,而不是作为评论),这将非常有帮助。

标签: node.js mongodb mongoose aggregation-framework


【解决方案1】:

您可以使用$redact$setIsSubset 作为$condtion 来做到这一点

var myList =  ["wood", "beer","coal", "paint", "copperore"]
db.collection.aggregate([
    { "$match": { "requirements.item": { "$in":  myList } } },
    { "$redact": { 
        "$cond": [ 
            { 
                "$setIsSubset": [ 
                    "$requirements.item", 
                    myList 
                ] 
            }, 
            "$$KEEP", 
            "$$PRUNE"
       ]
    }}
])

【讨论】:

    【解决方案2】:

    从您给定的文档中,如果您想查找包含 requirementscoalcoppercore 的文档,则以下查询:

    > db.materials.find({"requirements.item" : "coal", "requirements.item": "copperore" }).pretty()
    

    会返回:

    {
            "_id" : ObjectId("584990f083842cff8826d44f"),
            "productname" : "copper",
            "requirements" : [
                    {
                            "ammount" : 2,
                            "item" : "coal"
                    },
                    {
                            "ammount" : 2,
                            "item" : "copperore"
                    }
            ]
    }
    

    【讨论】:

    • 这很清楚。但我想让所有文档与更大的列表匹配。我的列表中可能有 50 个项目,我想获取所有文档,这些文档仅满足要求。
    • 您能否详细说明您所说的满足要求
    • 目标文档有一个需求数组。此数组中的每个项目都需要列在查询中的“可用项目”列表中。 (在这种情况下,也许满足是一个更好的词)
    【解决方案3】:

    如果我正确理解了您的问题(我不确定是否正确),您可以使用all 运算符:

    db.materials.find({"requirements.item": {$all: ["coal", "copperore"]}})
    

    【讨论】:

    • 不匹配所有要求包含煤炭和铜矿石的文件。但在我的情况下,我有一个列表 [“coal”,“copperore”,“bottle”,“beer”,“nails”......] 它需要匹配所有满足所有要求的文档。在这种情况下,这可能是铜和啤酒的文件。在您的示例中,我完全不知道要查询什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2018-04-07
    • 2018-07-12
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多