从mongodb文档中删除对象

时间:2016-06-23 04:58:25

标签: mongodb mongodb-query

我在Mongodb集合中有一个文档,我希望remove an object使用title密钥。

我尝试使用$unset,但它只是removes the title key而不是它所属的对象。

{
    "_id" : ObjectId("576b63d49d20504c1360f688"),
    "books" : [
        {
            "art_id" : ObjectId("574e68e5ac9fbac82489b689"),
            "title" :"abc",
            "price" : 40
        },
        {
            "art_id" : ObjectId("575f9badada0500d192c53f4"),
            "title" : "xyz",
            "price" : 20
        },
        {
            "art_id" : ObjectId("57458224d86b3d1561150f17"),
            "title" : "def",,
            "price" : 30
        }
    ],
    "user_id" : "575570c315e27d13167dfc0d"
}

5 个答案:

答案 0 :(得分:2)

$unset不会从数组中删除对象。 The $unset operator deletes a particular field. doc

改为使用$pull

  

$ pull运算符从现有数组中删除与指定条件匹配的值的所有实例。

尝试以下查询

db.collName.update({$pull : {books:{title:abc}}})

参考$pull-doc

希望这会对你有所帮助。

答案 1 :(得分:2)

要删除包含查询对象的整个对象,请使用db.remove()查询。

对于你的情况:

define dispStr(str, x, y) dispStrFont(str, normal_font, x, y, 0)

请仔细检查引用数组元素的格式。 这将删除包含嵌入式查询obj的整个对象 s 。要仅删除单个对象,请为其提供另一个字段以唯一标识它。

如果您只想从数组中删除包含title字段的对象但想要保留包含该数组的对象,请使用$ pull运算符。 This回答会有所帮助。

示例:如果要删除对象

db.yourcollection.remove({"books.title": "abc"});

仅来自数组,但保留父对象,如

        {
            "art_id" : ObjectId("574e68e5ac9fbac82489b689"),
            "title" :"abc",
            "price" : 40
        }

使用

{
    "_id" : ObjectId("576b63d49d20504c1360f688"),
    "books" : [
        {
            "art_id" : ObjectId("575f9badada0500d192c53f4"),
            "title" : "xyz",
            "price" : 20
        },
        {
            "art_id" : ObjectId("57458224d86b3d1561150f17"),
            "title" : "def",,
            "price" : 30
        }
    ],
    "user_id" : "575570c315e27d13167dfc0d"
}

答案 2 :(得分:0)

尝试使用pull。

https://docs.mongodb.com/manual/reference/operator/update/pull/

  

$拉

The $pull operator removes from an existing array all instances of a value or values that match a specified condition.

The $pull operator has the form:

{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }

To specify a <field> in an embedded document or in an array, use dot notation.

答案 3 :(得分:0)

尝试使用mongo shell

  

db.yourcollection.remove({书:[{标题:&#39; title_you_want&#39;}]})

小心牙套。

答案 4 :(得分:0)

如果...?我想删除文档内部而不是数组中的对象吗?

{
    "_id" : ObjectId("576b63d49d20504c1360f688"),
    "books" : {
        "574e68e5ac9fbac82489b689": {
            "art_id" : ObjectId("574e68e5ac9fbac82489b689"),
            "title" :"abc",
            "price" : 40
        },
        "575f9badada0500d192c53f4": {
            "art_id" : ObjectId("575f9badada0500d192c53f4"),
            "title" :"xyz",
            "price" : 20
        },
        "57458224d86b3d1561150f17": {
            "art_id" : ObjectId("57458224d86b3d1561150f17"),
            "title" : "def",
            "price" : 30
        }
    },
    "user_id" : "575570c315e27d13167dfc0d"
}

解决方案是这样的:

db.auctions.update(
    {'_id': ObjectId("576b63d49d20504c1360f688")},
    {$unset: {"books.574e68e5ac9fbac82489b689":
        {_id: "574e68e5ac9fbac82489b689"}}})