2013-02-14 112 views
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中解决这个问题。

任何帮助表示赞赏。

回答

2

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

语法:

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}]}); 
+0

再次感谢,期待这更复杂 – azz0r 2013-02-15 14:36:07

+0

2)和3)不正确,因为您不能在一个JS对象中多次使用相同的密钥。使用'$和'就像你显示的应该没问题。 – JohnnyHK 2013-02-15 14:39:53

+0

@johnnyHK,这取决于你的语言。而且似乎mongo shell也接受它。请注意,我没有存储它,只是在查询中使用。但是,“$和”选项似乎更好。 – MatheusOl 2013-02-15 19:20:06

0

还有一个更简单的方法。

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

希望这有助于

/节点X

编辑:

如果您需要匹配要返回文档,你可以使用$ elemMatch为

+0

“$ in”操作符可以匹配任何,而不是全部。 $ all操作符或$并且似乎是正确的方法。 – MatheusOl 2013-02-18 16:39:59

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]}});