【问题标题】:Mongo, match array of arraysMongodb,匹配数组数组
【发布时间】:2013-02-14 18:31:49
【问题描述】:

我有一个对象,上面有一组子对象:

    _id: "9",
        clients: [
            {
                id: 677,
                enabled: true,
                updated: 0,
                created: 1352416600
            },
            {
                id: 668,
                enabled: true,
                updated: 0,
                created: 1352416600
            }
        ],
        cloud: false,
        name: "love",
}

用户请求客户端 id 为 677 的图片,将返回上述对象

用户请求客户端ID为677和668的图片,返回上面的图片

用户请求客户端ID为677、668、690的图片,上面的图片没有返回

我正在使用 PHP 和 Mongo DB。用于支持此功能的 MYSQL 查询曾经使用 COUNT 和子查询。

我什至不知道从哪里开始在 Mongo 中解决这个问题。

任何帮助表示赞赏。

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    要搜索数组中的文档,可以使用点符号和“$and”运算符。

    语法:

    db.coll.find({"$and": [{"clients.id": <id1>}, {"clients.id": <id2>}, ... ]});
    

    给你样品:

    1) 用户请求客户端 id 为 677 的图像(仅针对一项,不需要“$and”,但您仍然可以使用):

    db.coll.find({"clients.id": 677});
    

    db.coll.find({"$and": [{"clients.id": 677}]});
    

    2) 用户请求客户端 ID 为 677 和 668 的图像:

    db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}]});
    

    3) 用户请求客户端 ID 为 677、668、690 的图像:

    db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}, {"clients.id": 690}]});
    

    【讨论】:

    • 2) 和 3) 不正确,因为您不能在一个 JS 对象中多次使用相同的键。像你展示的那样使用$and 应该没问题。
    • @johnnyHK,取决于您可以使用的语言。似乎 mongo shell 也接受它。请注意,我没有存储它,只是在查询中使用。但是,是的,“$and”选项似乎更好。
    • @MatheusdeOliveira mongo shell 会接受它,但它所做的只是使用其中一个字段(可能是最后一个)。
    • @JohnnyHK,你是对的,我编辑了答案只考虑“$and”。很抱歉这个错误。
    【解决方案2】:

    如果您想返回一个数组字段包含每个项目列表的文档,您可以使用$all 运算符。

    所以你的三种情况可以这样处理:

    1) 用户请求客户端 ID 为 677 的图像:

    db.coll.find({'clients.id': 677});
    

    2) 用户请求客户端 ID 为 677 和 668 的图像:

    db.coll.find({'clients.id': {$all: [677, 668]}});
    

    3) 用户请求客户端 ID 为 677、668 和 690 的图像:

    db.coll.find({'clients.id': {$all: [677, 668, 690]}});
    

    【讨论】:

      【解决方案3】:

      还有第三种更简单的方法。

      db.foo.find({"clients.id":{$in:[677,688,690]}});

      希望对你有帮助

      /节点

      编辑:

      如果您需要匹配确切的结构,您可以使用 $elemMatch

      【讨论】:

      • "$in" 运算符将匹配任何,而不是全部。 $all 运算符或 $and 似乎是正确的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多