2017-08-31 2 views
0

j'ai ces deux types de structures dans ma collection:tableaux multiples délasser et structure différente dans le document

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

et

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

je dois faire Agrégé, qui me renvoie une liste de ces documents et seulement le point spécifique ou l'information de l'utilisateur et avec sauter et limiter. Quelque chose comme:

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

J'ai utilisé, je suis nouveau à Mongo, pouvez-vous me recommander?

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

Dans quel but voulez-vous vous détendre? Essayez-vous de filtrer le contenu dans les tableaux? La condition OR ne rend pas vraiment vos intentions si claires. Mis à part le problème d'un produit cartésien, on ne sait pas quel résultat vous attendez. Alors peut-être développer votre échantillon pour démontrer ce que le résultat devrait être. –

+0

J'ai besoin d'un résultat qui me renvoie une liste dans une plage de '_id: date', avec les informations d'un utilisateur spécifique ou d'un point spécifique selon si la clé' point' ou 'user' est dans ce document. Peu importe la structure du résultat. Peut-être que se détendre n'est pas la solution, pourrait être un groupe. Comme je l'ai dit, je suis nouveau à Mongo. –

+0

Combien de documents y a-t-il dans la collection? Est-il nécessaire d'aller chercher en une seule opération? –

Répondre

0

les informations d'un utilisateur spécifique ou un point spécifique en fonction si le point ou la clé de l'utilisateur est dans ce document

Étant donné votre exemple fourni de document que vous pourriez être en mesure d'utiliser tout db.collection.find(), par exemple:

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

cela peut ne pas être idéal en fonction de votre cas d'utilisation, parce que vous êtes l'exécution find() deux fois. Cela retournerait votre une liste de documents avec leur _id. La requête ci-dessus équivaut à dire:

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' 

Voir aussi MongoDB Indexes

Cela dit ci-dessus, vous devriez reconsidérer vraiment votre schéma de document. Selon votre cas d'utilisation, il se peut que vous ayez des difficultés à interroger les données ultérieurement et que cela puisse avoir une incidence sur les performances de vos requêtes. Reportez-vous au MongoDB Data Models pour plus d'informations sur la conception de votre schéma.