【问题标题】:MongoDB query an array for an exact element match, but may be out of orderMongoDB 查询数组以获取精确的元素匹配,但可能是无序的
【发布时间】:2011-05-28 23:59:25
【问题描述】:

我在 MongoDB 中有一个如下所示的文档:

{ users: ["2", "3", "4"] }

我正在尝试通过匹配用户数组来查询此文档。

db.things.find( { users: { $all: [ "2", "3", "4" ] } } )

该查询有效,但也会返回此文档:

{ users: ["2", "3", "4", "5"] }

最后一个要求是能够查询带有乱序元素的用户数组,例如查询中的[ "3", "4", "2" ],并且它能够返回我列出的第一个文档。

任何帮助将不胜感激。提前致谢。

我也在使用 mongoid,如果它有一个任何人都知道的助手,但如果我需要,可以直接执行 mongo 查询。

【问题讨论】:

    标签: mongoid mongodb


    【解决方案1】:

    您可以将您的查询与 { users : { $size : 3 } } 子句结合起来,并调整大小以匹配您要查询的用户数量。这将确保您得到准确的集合,而不是子集。

    如果元素乱序,您可能需要为每个元素执行 { users : { $exists : "1" } },并将它们和 $size 子句结合在一起。

    【讨论】:

    • 太棒了!关系大脑的重要逻辑)我只是不了解$exists - 我们为什么需要它?
    • 因为如果元素乱序,$all 可能不会(注意,我没有测试过)返回文档。
    • 如何保证数组的顺序,以免文档乱序返回?
    • 我测试了 $all 运算符,我发现它也返回了无序数组,这意味着文档 { users: ["2", "3", "4"] } 将匹配查询:{"users" : { "$all" : [ "3" , "4" , "2"]}}。我还需要获取代表订单的文件,这意味着只有下一个标准:{“users”:{“$all”:[“2”,“3”,“4”]}}返回一个结果。有人知道如何实现吗?
    • { users: {"$all": [3, 1, 2]}} 和 { users: {"$size": 3}} 运算符效果很好!不错的提示,@ChrisShain!
    【解决方案2】:

    This answer 不正确。

    要查询文档以查找数组中的完全匹配,请执行此操作。

    db.things.insert({a:[1,2]});

    db.things.insert({a:[1,2,3]});

    db.things.find({a:[1,2]});

    returns {a:[1,2]}

    希望这会有所帮助 - 很明显它不在文档中

    【讨论】:

    • 哪个答案? StackOverflow 上的答案不必按照发布的顺序出现。如果您声称原始发布者接受并评论为有效的其他人的答案不正确,您必须更具建设性地解释为什么提供的解决方案不是最好的。
    • 该答案要求数组的顺序相同。 $all+$size 不要求顺序相同。
    • 嗨,有没有办法获取所有包含有序子集的文档?意思是,如果我查询 [1,2] 我希望它的结果是 [1,2], [1,2,3] 但如果我有 [1,3,2] 记录我不想要它成为结果的一部分,因为它不包含 [1,2]。
    猜你喜欢
    • 2018-04-04
    • 2015-06-28
    • 2020-02-23
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多