我正在mongo db中构建一个社交网络。 以下是组集合中的文档结构。它代表系统中存在的每个社交群体。用户是该组的一部分,由'members'属性表示,如果是json对象,则该属性是一个数组。
{
"group_name":"my group",
"members": [
{
"user_id": ObjectId("4e29341986ba75dc14000000"),
"joined": ISODate("2011-07-26T11:46:49.0Z")
},
{
"user_id": ObjectId("4e2ea94286ba75f81500000e"),
"joined": ISODate("2011-07-26T11:47:55.0Z")
},
{
"user_id": ObjectId("4e2eaa0786ba75e815000003"),
"joined": ISODate("2011-07-26T11:55:22.0Z")
},
{
"user_id": ObjectId("4e2eab7f86ba75ec1500000a"),
"joined": ISODate("2011-07-26T11:57:44.0Z")
},
{
"user_id": ObjectId("4e2eac3586ba75dc15000000"),
"joined": ISODate("2011-07-26T12:00:57.0Z")
},
{
"user_id": ObjectId("4e2eacae86ba75dc15000004"),
"joined": ISODate("2011-07-26T12:02:43.0Z")
},
{
"user_id": ObjectId("4e2eadbb86ba75ec1500000c"),
"joined": ISODate("2011-07-26T12:07:01.0Z")
}
]
我面临的问题是如何检查用户是否属于某个组。 这是我想出来的,但它似乎不起作用。 请帮忙。
$criteria = array(
'_id' => new MongoId($group_id),
'members' => array('user_id' => new MongoId($user_id))
);
return $collection->find($criteria);
答案 0 :(得分:4)
尝试使用以下代码:
$criteria = array(
'_id' => new MongoId($group_id),
'members.user_id' => new MongoId($user_id))
);
return $collection->find($criteria);
请参阅http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
答案 1 :(得分:3)
在Mongo shell中,您可以:
> criteria = {
... "_id" : ObjectId("group_id"),
... "members" : {
... $elemMatch : {
... "user_id" : ObjectId("user_id")
... }
... }
...}
> db.groups.find(criteria);
它会在groups
集合中搜索members
对象user_id
为ObjectId("user_id")
的条目。
没有在PHP中测试它,但由于结构相同,所以应该这样做:
$criteria = array(
'_id' => new MongoId($group_id),
'members' => array(
'$elemMatch' => array(
'user_id' => new MongoId($user_id)
)
)
);
return $collection->find($criteria);
提示:完全删除_id
子句,您可以找到用户所属的组(而不是分别查询每个组)。