MongoDB:找到数组中的最小元素并将其删除

meg*_*gas 12 python mongodb pymongo

我在MongoDB中有一个文档,其中一个看起来像这样:

{
"_id" : 100,
"name" : "Something",
"items" : [
    {
        "item" : 47,
        "color" : "red"
    },
    {
        "item" : 44,
        "color" : "green"
    },
    {
        "item" : 39,
        "color" : "blue"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

在每个文档中,我需要找到最小项并删除它.所以它应该是这样的:

{
"_id" : 100,
"name" : "Something",
"items" : [
    {
        "item" : 47,
        "color" : "red"
    },
    {
        "item" : 44,
        "color" : "green"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

看起来findAndModify应该在这里使用功能,但我不能再进一步了.

如何在数组中找到最小元素并将其删除?

我正在使用MongoDB和Pymongo驱动程序.

Kay*_*Kay 18

如果您不仅限于将查询放在一个步骤中,您可以尝试:

步骤1)使用$ unwind和$ group运算符的聚合函数来查找每个文档的最小项目

myresults = db.megas.aggregate( [ { "$unwind": "$items" },  
    {"$group": { '_id':'$_id' , 'minitem': {'$min': "$items.item" } } } ] )
Run Code Online (Sandbox Code Playgroud)

步骤2)循环结果和$从数组中拉出元素

for result in myresults['result']:
    db.megas.update( { '_id': result['_id'] }, 
        { '$pull': { 'items': { 'item': result['minitem'] } } } )
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望过滤器最少使用红色或绿色项目,则可以在聚合语法中添加{'$ match':{"items.color":"red"}}. (4认同)

Fak*_* 10 9

请找到我用普通javascript编写的解决方案.它应该直接通过MongoDb shell

cursor = db.students.aggregate(
[{ "$unwind": "$items" }, 
 { "$match": { "items.color": "green"}},
 { "$group": {'_id': '$_id', 'minitem': {
                '$min': "$items.item"
            }
        }
    }

]);

cursor.forEach(
function(coll) {
    db.students.update({
        '_id': coll._id
    }, {
        '$pull': {
            'items': {
                'item': coll.minitem
            }
        }
    })
})
Run Code Online (Sandbox Code Playgroud)