Mongo,匹配数组数组

时间:2013-02-14 18:31:50

标签: php mongodb

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

    _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哪里开始解决这个问题。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

要搜索数组中的文档,可以使用点表示法和“$ 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}]});

答案 1 :(得分:1)

如果您想要返回文档,其中数组字段包含每个项目列表,您可以使用$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]}});

答案 2 :(得分:0)

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

db.foo.find({ “clients.id”:{$中:[677688690]}});

希望这有帮助

/节点X

编辑:

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