i tried it using python "list comprehension" and it seems it's the "$"
that dont incremenet: he just find on result and stops.
[i for i in
db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up.spec.prix")
if i<=20000]
[1000, 20000]
list(db.users.find({"produit_up.spec.prix":{"$in":[i for i in
db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up.spec.prix")
if i<=20000]}}, {"produit_up.$":1}))
[{u'_id': ObjectId('5061fab93a5f3a09f4be0e21'),
u'produit_up': [{u'avatar': {u'avctype': u'image/jpeg',
u'orientation': u'portrait',
u'photo': ObjectId('506867863a5f3a0ea84dcd6c')},
u'spec': {u'abus': 0,
u'date': u'2012-09-30',
u'description': u"portable tr\xe8s solide, peu servi, avec
batterie d'une autonomie de 3 heures.",
u'id': u'alucaard134901952647',
u'namep': u'nokia 3310',
u'nombre': 1,
u'prix': 1000,
u'tags': [u'portable', u'nokia', u'3310'],
u'vendu': False}}]}]
and it gives me the same thing as:
list(db.users.find({"produit_up.spec.tags":{"$in":["nokia"]}},
{"produit_up.spec.$":1, "_id":0,"personnel.pseudo":1,"produit_up":
1,"adresse.commune":1}))
[{u'adresse': {u'commune': u'Azazga'},
u'personnel': {u'pseudo': u'alucaard'},
u'produit_up': [{u'avatar': {u'avctype': u'image/jpeg',
u'orientation': u'portrait',
u'photo': ObjectId('506867863a5f3a0ea84dcd6c')},
u'spec': {u'abus': 0,
u'date': u'2012-09-30',
u'description': u"portable tr\xe8s solide, peu servi, avec
batterie d'une autonomie de 3 heures.",
u'id': u'alucaard134901952647',
u'namep': u'nokia 3310',
u'nombre': 1,
u'prix': 1000,
u'tags': [u'portable', u'nokia', u'3310'],
u'vendu': False}}]}]
confirmed: the positional element is good for returning one element
when you have subdocument elements.
but here is the bizarre thing:
list(db.users.find({"produit_up.spec.prix":{"$in":[i for i in
db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up.spec.prix")
if i<=20000]}}, {"produit_up.something_that_dont_existe_blablablabla.
$":1}))
[{u'_id': ObjectId('5061fab93a5f3a09f4be0e21'),
u'produit_up': [{u'avatar': {u'avctype': u'image/jpeg',
u'orientation': u'portrait',
u'photo': ObjectId('506867863a5f3a0ea84dcd6c')},
u'spec': {u'abus': 0,
u'date': u'2012-09-30',
u'description': u"portable tr\xe8s solide, peu servi, avec
batterie d'une autonomie de 3 heures.",
u'id': u'alucaard134901952647',
u'namep': u'nokia 3310',
u'nombre': 1,
u'prix': 1000,
u'tags': [u'portable', u'nokia', u'3310'],
u'vendu': False}}]}]
so it looks only for the name of the sub doucment, and dont seek for
its attributes (dont veritfy if what is after the dot exists)?
but if i write:
list(db.users.find({"produit_up.spec.prix":{"$in":[i for i in
db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up.spec.prix")
if i<=20000]}}, {"produitup.something_that_dont_existe.$":1}))
i got an error: OperationFailure: database error: Positional operator
does not match the query specifier.
so i think i learn aggregation!
here is what i get:
db.users.aggregate([{"$unwind":"$produit_up"},{"$match":
{"produit_up.spec.prix":{"$gte":1000,"$lte":20000}}}, {"$group":
{"_id":"$_id","produit_up":{"$push":"$produit_up.spec.prix"}}}])
Out[9]:
{u'ok': 1.0,
u'result': [{u'_id': ObjectId('5061fab93a5f3a09f4be0e21'),
u'produit_up': [1000, 20000]}]}
db.users.aggregate([{"$unwind":"$produit_up"},{"$match":
{"produit_up.spec.prix":{"$gte":1000,"$lte":20000}}}, {"$group":
{"_id":"$_id","produit_up":{"$push":"$produit_up.spec.namep"}}}])
Out[13]:
{u'ok': 1.0,
u'result': [{u'_id': ObjectId('5061fab93a5f3a09f4be0e21'),
u'produit_up': [u'nokia 3310', u'iphone 3gs']}]}
i love that ;)
> ...
>
> plus de détails »