0

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

    _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 中解决这个问题。

任何帮助表示赞赏。

4

3 回答 3

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}]});
于 2013-02-15T14:29:04.883 回答
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]}});
于 2013-02-15T14:52:47.820 回答
0

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

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

希望这可以帮助

/节点

编辑:

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

于 2013-02-15T14:44:23.807 回答