从文档中的不同结构中展开多个数组

时间:2017-08-31 13:03:23

标签: python mongodb pymongo

我的收藏中有两种类型的结构:

{
    _id: "date1",
    users: [{"user": "123", ...}, {"user": "456", ...}]
}

{
    _id: "date2",
    points: [{"point": "1234", ...}, {"point": "5678", ...}]
}

我需要制作一个agregation,它会返回这些文档的列表,只返回特定的点或用户信息以及skip和limit。类似的东西:

[
    {_id: "date1", user: {"user": "123", ...}},
    {_id: "date2", point: {"point": "1234", ...}},
]

我已经习惯了,我是mongo的新人,你能给我任何推荐吗?

collection.aggregate([
{"$unwind": "$users"},
{"$unwind": "$points"},
{"$match": {"$or": [
    {'users.user': an_user},
    {'points.point': a_point}]}},
{"$sort": {"_id": -1}},
{"$skip": 10},
{"$limit": 10}
])

1 个答案:

答案 0 :(得分:0)

  

包含一个特定用户或一个特定点的信息,具体取决于该文档中的点或用户密钥

根据您提供的文档示例,您可以使用db.collection.find(),例如:

db.collection.find({"users.user": a_user}, {"users.$":1});
db.collection.find({"points.point": a_point}, {"points.$":1});

根据您的使用情况,这可能不太理想,因为您执行find()两次。 这将返回您的_id文档列表。上面的查询相当于说:

Find all documents in the collection 
where in array field users contain a user 'a_user' 
OR in array field points contain a point 'a_point'

另见MongoDB Indexes

说完上述内容后,您应该重新考虑您的文档架构。根据您的使用情况,您可能会在以后查询数据时遇到困难,并可能影响查询性能。请查看MongoDB Data Models以提供有关如何设计架构的更多信息。