Ne pouvez pas utiliser $match avec la mangouste et de l'agrégation cadre
C'est mon Schéma:
var userschema = new mongoose.Schema({
user: String,
follow: [String],
imagen: [{
title: String,
date: { type: Date, default: Date.now }
}]
});
Et c'est le code:
usermodel.findOne({ user: req.session.user }, function (err, user){
usermodel.aggregate({$unwind: '$imagen'},
{$match: { _id: { $in: user.follow }}},
{imagen: true},
{$sort: {'imagen.date': 1}},
function (err, images){
console.log(images);
res.render('home.ejs', {
user: user,
following: images
});
});
});
La follow
contient les utilisateurs du _id
.
Le code fonctionne, sauf que quand j'ai inclure la $match
. J'utilise le $match
pour filtrer le résultat, en obtenant seulement les images de l'utilisateur que je suis, mais la console.journal de me montrer que le résultat de la aggregate
de recherche n'est pas défini, mais quand je n'écris pas de la $match
requête, j'obtiens des images, mais j'ai obtenir toutes les images, pas seulement les images de l'utilisateur que je suis.
Est qu'il ya une solution pour cela...?
Merci d'avance!
EDIT:
var express = require('express');
var MongoStore = require('connect-mongo')(express);
var fs = require('fs');
var mongoose = require('mongoose');
var app = express();
app.listen(9191);
var sessionStore = new MongoStore({db: 'session'});
app.configure(function(){
app.use(express.bodyParser());
app.set('views',__dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));
app.use(express.cookieParser());
app.use(express.session({
store: sessionStore,
secret: 'secret'
}));
app.use(app.router);
});
var db = mongoose.createConnection('localhost', 'test');
var userschema = new mongoose.Schema({
user: String,
follow: [String],
imagen: [{
title: String,
date: { type: Date, default: Date.now }
}]
});
var usermodel = db.model('usermodel', userschema);
var ObjectId = require('mongoose').Types.ObjectId;
app.get('/', middleware.noses, function (req, res){
res.render('home0.ejs');
});
app.get('/home', middleware.yeses, function (req, res){
usermodel.findOne({ user: req.session.user }, function (err, user){
if (user.follow.length != 0){
usermodel.find({ _id: {$in: user.follow } }, { user: true }, function (err, users){
var usernames = users.map(function(u){ return u.user });
usermodel.aggregate({$match: { _id: { $in: user.follow.map(
function(id){ return new ObjectId(id); })}}},
{$unwind: '$imagen'},
{imagen: true},
{$sort: {'imagen.date': 1}},
function (err, images){
console.log(images);
res.render('home.ejs', {
user: user,
following: images
});
});
});
} else {
res.render('home.ejs', {
user: user,
following: undefined
});
}
});
});
EDIT:
[ { __v: 4,
_id: 50fd9c7b8e6a9d087d000006,
follow: ['50fd9cbd1322de627d000006', '50fd9d3ce20da1dd7d000006'],
imagen:
[{ title: 'foo',
_id: 50fd9ca2bc9f163e7d000006,
date: Mon Jan 21 2013 20:53:06 GMT+0100 (CET) },
{ title: 'foot',
_id: 50fda83a3214babc88000005,
date: Mon Jan 21 2013 21:42:34 GMT+0100 (CET) }],
user: 'Mrmangado' }
Vous avez un projet,
Comment le projet
user
avant de le détendre si vous avez l'intention de l'utiliser après le déroulement edit: lu trop vite, vous avez pour projet la _id
outComment le projet
_id
?
OriginalL'auteur MrMangado | 2013-01-27
Vous devez vous connecter pour publier un commentaire.
Mangouste ne fait pas de schéma de base de la coulée des arguments de
aggregate
, si vous avez besoin de convertir votreuser.follow
tableau de string id dans un tableau de ObjectIds dans le$match
:REMARQUE: Ne pas utiliser
mongoose.Schema.Types.ObjectId
pour la coulée. Il ne fonctionnera pas.Vous devez également déplacer ce
$match
le début de la préparation pour l'efficacité.Mise à JOUR
Votre autre problème est que vous devez utiliser une
$project
opérateur au lieu de simplement y compris une plaine{imagen: true}
objet dans le pipeline. Mettre tous ensemble et de réorganisation pour une canalisation plus efficace, cela a fonctionné pour moi avec vos données:Pouvez-vous modifier votre question à inclure un exemple de la doc ou des deux? Le plus vous le faire pour les gens à reproduire votre problème, plus il est facile de répondre complètement à la question.
Ok! Mais il n'y a pas beaucoup plus de code
La mise à jour. J'espère que ça aiderait
REMARQUE: Le champ ObjectId constructeur de vie à deux endroits:
mongoose.Types.ObjectId
etmongoose.Schema.Types.ObjectId
. Ce dernier n'a pas de travail pour moi! Espérons que l'aide à quelqu'un.OriginalL'auteur JohnnyHK
À toute personne qui bute sur cette question, en espérant un plus "générique" de la solution avec la nécessité manuellement
.map
ou faire les conversions/transformation manuelle, voici une solution quimay
travail pour vous:Exigences: Votre objet de requête pour l' $match doit s'inscrire dans des schémas que vous avez créé.
Solution Générale:
Le piège ici est Mangouste Requête API
Query#cast
qui peuvent vous aider à transformer votre objet ordinaire en ce que le schéma définit. Cela permet de normaliser ObjectIDs, des chaînes et des nombres.Solution Possible à cette Question:
En ne considérant que le $match de la phase:
OriginalL'auteur kazenorin