我有一个对象,上面有一个子对象数组:
_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哪里开始解决这个问题。
任何帮助表示感谢。
答案 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