【问题标题】:MongoDb update object in a array on first occurence from lastMongoDb 更新数组中第一次出现的对象
【发布时间】:2014-08-13 04:52:08
【问题描述】:

我有一个如下所示的示例文档

{
 "_id" : "docID",
 "ARRAY" : [ 
    {
        "k" : "value",
        "T" : "20:15:35",
        "I" : "Hai"
    }, 
    {
        "K" : "some value",
        "T" : "20:16:35",
        "I" : "Hello"
    }, 
    {
        "K" : "some other value",
        "T" : "20:15:35",
        "I" : "Update"
    } 
   ]
}

我正在尝试根据字段 "ARRAY.T"(这是我在更新时知道的唯一字段)更新“ARRAY”中的最后一个元素,但我的问题是数组中的第一个元素与查询匹配,并且其 ARRAY.I 字段被更新。

用于更新的查询:

db.collection.update( { _id: "docID","ARRAY.T" : "20:15:35"},
                { $set: { "ARRAY.$.I": "Updated value" }               
                })

实际上我不知道要更新的数组索引,所以我必须在查询中使用 ARRAY.I,有没有办法告诉 Mongodb 更新第一个匹配的元素从数组的最后一个查询。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我理解您的意思,您希望在这种情况下匹配最后一个元素,或者实际上以相反的顺序处理匹配。无法修改它,存储在positional $ 运算符中的索引将始终是“第一个”匹配项。

    但是你可以改变你的方法,因为$push 的默认行为是“追加”到数组的末尾。但是 MongoDB 2.6 引入了 $position 修饰符,因此您实际上可以始终“预先挂起”数组,这意味着您的“最旧”项位于末尾。

    以此为例:

    db.artest.update(
       { "array": { "$in": [5] } },
       { "$push": { "array": { "$each": [5], "$position": 0 } }},
       { "upsert": true }
    )
    
    db.artest.update(
        { "array": { "$in": [5] } },
        { "$push": { "array": { "$each": [6], "$position": 0 } }},
        { "upsert": true }
    )
    

    这会产生一个与正常 $push 行为“相反”的文档:

    { "_id" : ObjectId("53eaf4517d0dc314962c93f4"), "array" : [ 6, 5 ] }
    

    或者,您可以在更新文档时应用$sort 修饰符,以便“排序”元素,使它们被颠倒。但如果存储重复值,这可能不是最佳选择。

    因此,如果您打算“首先”匹配“最新”项目,请考虑将数组存储在“反向”中。目前,这是您获得“最后匹配”行为的唯一方法。

    【讨论】:

    • 感谢@neil 的想法,目前我通过使用 INDEX 更新来满足我的需求,我通过聚合得到了它(我很少需要)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多