使用embedMany查询文档时遇到问题。
这些是我的文档,其中用户嵌入了许多组(我称之为用户组)。
class User {
/**
* @MongoDB\Id
*/
protected $id;
/**
* @MongoDB\Field(type="string")
*/
protected $name;
/**
* @MongoDB\EmbedMany(targetDocument="Group", strategy="setArray")
* @var UserGroups[]
*/
protected $userGroups;
}
class UserGroup {
/**
* @MongoDB\NotSaved
* @MongoDB\ReferenceOne(targetDocument="Group")
* @var Group
*/
protected $group;
/**
* @MongoDB\Field(type="string")
* @var string
*/
protected $type;
/**
* @MongoDB\Field(type="date")
* @var \DateTime
*/
protected $joinedAt;
}
这些是用户集合中的DB文档:
{
"_id" : ObjectId("56de151b821b16ac02310a25"),
"name" : "Some user name",
"userGroups" : [
{
"group" : DBRef("groups", ObjectId("5705157244ae89863aaeb725"), "some group name"),
"type" : "T1",
"joinedAt" : ISODate("2016-05-13T19:59:43.000+0000")
},
{
"group" : DBRef("groups", ObjectId("571498f7821b16100c5bcc58"), "some other group name"),
"type" : "T1",
"joinedAt" : ISODate("2016-05-21T20:07:26.000+0000")
},
{
"group" : DBRef("groups", ObjectId("57348618c67940a0528b4567"), "some other group name T2"),
"type" : "T2",
"joinedAt" : ISODate("2016-05-30T18:07:39.000+0000"),
}
]
}
{
"_id" : ObjectId("287sd3d728as56dnsdu2hsds782nsdsd"),
"name" : "Some other user name",
"userGroups" : [
{
"group" : DBRef("groups", ObjectId("5705157244ae89863aaeb725"), "some group name"),
"type" : "T2",
"joinedAt" : ISODate("2016-05-13T19:59:43.000+0000")
},
{
"group" : DBRef("groups", ObjectId("57348618c67940a0528b4567"), "some other group name T2"),
"type" : "T2",
"joinedAt" : ISODate("2016-05-30T18:07:39.000+0000"),
}
]
}
如何使用group
查询ID '5705157244ae89863aaeb725'
中的用户并输入"T1"
?
“用户”集合中的以下查询向两个用户提供,并且它应仅提供第一个,其中包含ID '5705157244ae89863aaeb725'
的组并键入"T1"
{ userGroups: { $elemMatch:
{ "group.$id": ObjectId("5705157244ae89863aaeb725"), "type": "T1" } }}
但无法按joinedAt
字段
答案 0 :(得分:0)
要对内部数组字段进行排序,您需要使用聚合框架: 此示例包含步骤,您可以删除它们以查看文档更改方式
var unwind = {
$unwind : "$userGroups"
}
var match = {
$match : {
"userGroups.group.$id" : ObjectId("5705157244ae89863aaeb725"),
"userGroups.type" : "T1"
}
}
var sort = {
$sort : {
"userGroups.joinedAt" : -1
}
}
var reGroup = {
$group : {
_id : {
id : "$_id",
name : "$name"
},
userGroups : {
$push : "$userGroups"
}
}
}
var reShapeDocument = {
$project : {
_id : "$_id.id",
name : "$_id.name",
userGroups : 1
}
}
//第1步
db.coll.aggregate([match ])
//第2步
db.coll.aggregate([match, unwind ])
//第3步
db.coll.aggregate([match, unwind, match, ])
//第4步
db.coll.aggregate([match, unwind, match, sort, ])
//步骤5,6
db.coll.aggregate([match, unwind, match, sort, reGroup, reShapeDocument])
1和3仅选择匹配条件的文档,2 - 将数组元素展开为单独的文档,4 - 执行排序,5和6用于恢复先前的形状