MongoDB,从数组中删除对象

IT技术 javascript arrays node.js mongodb mongoose
2021-02-05 14:37:27

文件:

{
   _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 中,但我找不到它。

6个回答

尝试..

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
2021-03-15 14:37:27
这些布尔值是什么?
2021-03-20 14:37:27
是的,我的语法是错误的。谢谢!还尝试了没有沮丧和多选项的情况,效果也很好。
2021-04-01 14:37:27

我有一个像

在此处输入图片说明

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

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

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 中执行此操作?
2021-03-21 14:37:27
我认为这是 nodejs (express) 解决方案而不是 MongoDB 查询解决方案
2021-04-03 14:37:27

你也可以试试:

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

我的数据库:

{
  "_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 }
  ]
}

对于数组中的单个记录:

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

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

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