【问题标题】:Update specific values in a nested array within mongo through mongoose通过 mongoose 在 mongodb 中更新嵌套数组中的特定值
【发布时间】:2013-03-27 11:19:24
【问题描述】:

我有一些以下架构(没有_id) -

 {uid: String,
 inbox:[{msgid:String, someval:String}]
 }

现在,在请求中,我得到了 msgid,并在下面的 mongoose 查询中使用它,如下所示 -

 my_model.findOne({'inbox.msgid':'msgidvaluexyz'}
  , function(err, doc) {           
    console.log(doc);
    return !0; })

现在,问题是我得到了整个文档,其中包含特定消息以及收件箱中的其他消息 -

   Output-
   {uid:'xyz',
    inbox:[
     {msgid:,someval},
     {msgid:'our queried msgid',someval}, //required sub array
     {msgid:,someval},
      ]
       }

现在我可以使用什么查询来获取特定的子数组,因为文档收件箱太大而无法循环。

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    使用$ positional selection operator 让返回的文档只包含匹配的inbox 元素:

    my_model.findOne({'inbox.msgid':'msgidvaluexyz'}
      , {'inbox.$': 1}
      , function(err, doc) {           
        console.log(doc);
        return !0; })
    

    【讨论】:

    • thx man..看起来确实可以完成工作..将节省一些严重的处理时间.. :)
    • 一个快速的问题...回调确实返回了特定的子数组..但是当我尝试更改某些内容并保存回调变量时...说 callback_doc.inbox[0].changed_var=something ;callback_doc.save() .. 它更新对数组第一个索引的更改(索引 0).. 我们如何在回调中引用特定索引.. 类似于 callback_doc.inbox[$] ?
    • @user597272 你没有整个对象,所以我想你会想通过update而不是save来更新它,并使用$位置更新运算符来服务更新方面的相同目的。
    • ...实际上我使用的是保存,因为在猫鼬文档中它说保存遵循更新跳过的例行完整性检查..但是我不理解保存子数组的行为... function(err, doc) { doc.save(function(err1, doc1) {})} .. 在这里我更改 'doc' 并输出 'doc1' 确实显示它已更改.. 但在 mongo 中它会更新元素'0th' 位置.. 我更改 doc.inbox[0].changed_var bcoz doc 只返回'0th' 收件箱数组.. 我不能用'$' 代替'0' 吗?
    • srry for the big post.. 简而言之,我可以获得返回的子数组的数字索引吗?
    【解决方案2】:

    如果我正确理解了您的问题:

    // find each person with a last name matching 'Ghost'
    var query = Person.findOne({ 'name.last': 'Ghost' });
    
    // selecting the `name` and `occupation` fields
    query.select('name occupation');
    

    http://mongoosejs.com/docs/queries.html

    您可以选择要返回的字段。您只能获得 inbox 数组或除此之外的所有内容。

    【讨论】:

    • srry..但我认为您没有正确理解我的问题...“收件箱”字段是一个数组,它仍将包含所有 msg 子数组..
    猜你喜欢
    • 2015-01-31
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2013-09-05
    • 2020-10-01
    • 2017-01-24
    相关资源
    最近更新 更多