蒙戈,数组
的匹配阵列我已经包含子对象的在其上的阵列的对象:蒙戈,数组
_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中解决这个问题。
任何帮助表示赞赏。
要搜索数组内的文档,可以使用点符号和“$和”运算符。
语法:
db.coll.find({"$and": [{"clients.id": <id1>}, {"clients.id": <id2>}, ... ]});
为您的样品:
1)用户,使与客户端ID 677(图像只有一个项目的请求,也没有必要的 “$和”但你可以使用无论如何):
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}]});
还有一个更简单的方法。
db.foo.find({“clients.id”:{$ in:[677,688,690]}});
希望这有助于
/节点X
编辑:
如果您需要匹配要返回文档,你可以使用$ elemMatch为
“$ in”操作符可以匹配任何,而不是全部。 $ all操作符或$并且似乎是正确的方法。 – MatheusOl 2013-02-18 16:39:59
对于案件的具体结构如果数组字段包含每个项目列表,则可以使用$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]}});
再次感谢,期待这更复杂 – azz0r 2013-02-15 14:36:07
2)和3)不正确,因为您不能在一个JS对象中多次使用相同的密钥。使用'$和'就像你显示的应该没问题。 – JohnnyHK 2013-02-15 14:39:53
@johnnyHK,这取决于你的语言。而且似乎mongo shell也接受它。请注意,我没有存储它,只是在查询中使用。但是,“$和”选项似乎更好。 – MatheusOl 2013-02-15 19:20:06