【问题标题】:MongoDB, remove object from arrayMongoDB,从数组中删除对象
【发布时间】:2013-03-16 12:13:37
【问题描述】:

文档:

{
   _id: 5150a1199fac0e6910000002,
   name: 'some name',
   items: [{
      id: 23,
      name: 'item name 23'
   },{
      id: 24,
      name: 'item name 24'
   }]
}

有没有办法从数组中提取特定对象? IE。如何从 items 数组中提取 id 为 23 的整个 item 对象。

我试过了:

db.mycollection.update({'_id': ObjectId("5150a1199fac0e6910000002")}, {$pull: {id: 23}});

但是我很确定我没有正确使用“拉”。据我了解,pull 会从数组中提取一个字段,而不是从对象中提取一个字段。

关于如何将整个对象拉出数组的任何想法。

作为奖励,我正在尝试在 mongoose/nodejs 中执行此操作,也不确定这种类型的东西是否在 mongoose API 中,但我找不到。

【问题讨论】:

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

试试..

db.mycollection.update(
    { '_id': ObjectId("5150a1199fac0e6910000002") }, 
    { $pull: { items: { id: 23 } } },
    false, // Upsert
    true, // Multi
);

【讨论】:

  • 是的,我的语法错误。谢谢!也尝试过没有不安和多选项,效果也很好。
  • 那些布尔值是什么?
  • @NicolasDelValle 如果我没记错的话,这些选项是upsertmulti。有关当前语法和文档,请查看此链接:docs.mongodb.com/manual/reference/method/db.collection.update
【解决方案2】:

我有一个类似的文件

我必须从地址数组中删除地址

在网上搜索了很多后,我找到了解决方案

Customer.findOneAndUpdate(query, { $pull: {address: addressId} }, (err, data) => {
    if (err) {
        return res.status(500).json({ error: 'error in deleting address' });
    }

    res.json(data);
});

【讨论】:

  • 如何在 MongoDB CLI 中执行此操作?
  • 我认为这是 nodejs (express) 解决方案而不是 MongoDB 查询解决方案
【解决方案3】:

你也可以试试:

db.getCollection('docs').update({ },{'$pull':{ 'items':{'id': 3 }}},{multi:true})

【讨论】:

    【解决方案4】:

    我的数据库:

    {
      "_id" : ObjectId("5806056dce046557874d3ab18"),
      "data" : [ 
        { "id" : 1 }, 
        { "id" : 2 }, 
        { "id" : 3 }
      ]
    }
        
    

    我的查询:

    db.getCollection('play_table').update({},{$pull:{"data":{"id":3}}},{multi:true}
    

    输出:

    {
      "_id" : ObjectId("5806056dce046557874d3ab18"),
      "data" : [ 
        { "id" : 1 }, 
        { "id" : 2 }
      ]
    }
    

    【讨论】:

      【解决方案5】:

      对于数组中的单个记录:

      db.getCollection('documents').update(
          { },
          {'$pull':{ 'items':{'mobile': 1234567890 }}},
          {new:true}
      );
      

      对于数组中具有相同手机号码的多条记录:

      db.getCollection('documents').update(
          { },
          {
              $pull: {
                  items: { mobile: 1234567890 }
              }
          },
          { new:true, multi:true }
      )
      

      【讨论】:

        【解决方案6】:

        使用$pull 删除数据

        return this.mobiledashboardModel
        .update({"_id": args.dashboardId}, { $pull: {"viewData": { "_id": widgetId}}})
        .exec()
        .then(dashboardDoc => {
             return {
                result: dashboardDoc
             }
        });
        

        【讨论】:

          【解决方案7】:

          Kishore Diyyana:

          如果要删除所有元素,包括元素属性列表的键。

          这里是 mongoDB 未设置操作符的示例:

          db.UM_PREAUTH_CASE.update(
          { 'Id' : 123}, { $unset: { dataElements: ""} } )
          

          JSON 看起来像这样:

          { "Id":123,"dataElements" : [ { "createdBy" : "Kishore Babu Diyyana", "createdByUserId" : 2020 }, { "createdBy" : "Diyyana Kishore", "createdByUserId" : 2021 } ] }
          

          【讨论】:

            猜你喜欢
            • 2023-02-15
            • 2015-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-10
            • 2016-03-16
            相关资源
            最近更新 更多