如何使用嵌入数组查询文档并对其进行排序

时间:2016-06-01 12:18:47

标签: mongodb symfony mongodb-query doctrine-odm odm

使用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字段

对其进行排序

1 个答案:

答案 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用于恢复先前的形状