如何使用$ in只获取一个子文档

时间:2012-09-15 21:53:16

标签: python mongodb search pymongo

我如何获得正确的子文档?因为在这里我得到了“全部”!

db.users.find({"produit_up.tags":{"$in":["ddsfdsf"]}}).distinct("produit_up")
Out[1]: 
[{u'abus': 0,
 u'avctype': u'image/jpeg',
 u'date': u'2012-09-15',
 u'description': u'ddsfdsf sdfsdfsdf',
 u'id': u'alucaard134773657029',
 u'namep': u'nokia 3310',
 u'nombre': 2,
 u'orientation': u'portrait',
 u'photo': ObjectId('5054d3fa3a5f3a0598b792a2'),
 u'prix': 24,
 u'tags': [u'ddsfdsf', u'sdfsdfsdf'],
 u'vendu': False},
{u'abus': 0,
 u'avctype': u'image/jpeg',
 u'date': u'2012-09-15',
 u'description': u'dfsdfdsf dsfsdfdsfsdf dsfsdfsdf sdfsdfsdf',
 u'id': u'alucaard134773653643',
 u'namep': u'iphone 4gs',
 u'nombre': 2,
 u'orientation': u'portrait',
 u'photo': ObjectId('5054d3d83a5f3a0598b792a0'),
 u'prix': 18,
 u'tags': [u'dfsdfdsf', u'dsfsdfdsfsdf', u'dsfsdfsdf', u'sdfsdfsdf'],
 u'vendu': False}]

对不起标签,我只是想添加新元素,我得到了这个:(

2 个答案:

答案 0 :(得分:2)

如果每个文档只有一个匹配的子文档(或者您很乐意只返回第一个匹配的子文档),则可以使用positional operator ($)

mongo shell中使用它的示例:

  

db.users.find({ “produit_up.tags”:{$中:[ “ddsfdsf”]}},{ “produit_up $。”:1})

{
    "_id" : ObjectId("5055a7abac2ec70755816f7b"),
    "produit_up" : [
        {
            "abus" : 0,
            "avctype" : "image/jpeg",
            "date" : "2012-09-15",
            "description" : "ddsfdsf sdfsdfsdf",
            "id" : "alucaard134773657029",
            "namep" : "nokia 3310",
            "nombre" : 2,
            "orientation" : "portrait",
            "photo" : ObjectId("5054d3fa3a5f3a0598b792a2"),
            "prix" : 24,
            "tags" : [
                "ddsfdsf",
                "sdfsdfsdf"
            ],
            "vend" : false
        }
    ]
}

如果要为每个文档返回多个匹配的子文档,可以在MongoDB 2.2中使用新的Aggregation Framework

db.users.aggregate(

    // Match on indexed `tags` field to limit results
    { $match : { "produit_up.tags":"ddsfdsf" }},

    // Convert produit_up array embedded docs to a stream of documents  
    { $unwind: "$produit_up" },

    // Find all matching subdocuments
    { $match : { "produit_up.tags":"ddsfdsf" }}
)

答案 1 :(得分:0)

使用限制。

db.users.find({"produit_up.tags":{"$in":["ddsfdsf"]}}).limit(1);