【问题标题】:mongodb array matchingmongodb数组匹配
【发布时间】:2012-07-25 10:01:06
【问题描述】:

我该如何完成以下任务?

db.test.save( {a: [1,2,3]} );

db.test.find( {a: [1,2,3,4]} );  //must match because it contains all required values [1, 2, 3]
db.test.find( {a: [1,2]} );  //must NOT match because the required value 3 is missing

我知道 $in 和 $all,但它们的工作方式不同。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    有趣..问题是.. $in 和 $or 运算符被应用于您正在比较的数组元素反对集合中的每个文档,而不是元素文档中的数组..总结您的问题:您希望它匹配,如果集合中的任何文档恰好是传递数组的 子集。除非您交换输入和输出,否则我想不出办法。我的意思是..让我们接受您的第一个输入:

    db.test.find( {a: [1,2,3,4]} );

    考虑将其放入临时集合中,例如,temp 为:

    db.temp.save( {a: [1,2,3,4]} );

    现在遍历测试集合中的每个文档并在 temp 中“找到”它,使用 $all 运算符确保它被完全包含,即,执行以下操作:

    foreach(doc in test)
    { db.temp.find( { a: { $all: doc.a } } ); }


    这绝对是一种解决方法!我不确定我是否缺少任何其他可以完成这项工作的操作员。

    【讨论】:

      【解决方案2】:

      目前没有运算符可以查找具有子集值的文档。有一个改进的建议是添加一个 $subset 运算符。请随时在 JIRA 中对问题进行投票: https://jira.mongodb.org/browse/SERVER-974

      其他可能不适合您的用例的潜在解决方法可能涉及 map reduce 或新的聚合框架(在 MongoDB 版本 2.2 中可用): http://docs.mongodb.org/manual/reference/aggregation/#_S_project

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 2019-07-17
        相关资源
        最近更新 更多