簡體   English   中英

使用MongoDB,如何使用變量中的對象更新數組中的對象?

[英]With MongoDB, how do I update an object within in array with an object from a variable?

我有一個分配給變量的對象,例如:

var child = {
    { 
        _id: 'ObjectID("16e7f7baa05c3a9d751363")',
        title: 'Testing',
        sort: 3,
        active: true 
    }

以下內容無效,說實話,我不確定自己所缺少的內容:

db.category.update(
    { _id: "thisistheparentdocumentsid", "children._id": child._id },
    {
        $set: {
            "children.$.title": child.title,
            "children.$.active": child.active,
            "children.$.sort": child.sort
        }
    }
);

我真正想做的是,因為我想重用此方法,以后不再重復說明:

db.category.update(
    { _id: "thisistheparentdocumentsid", "children._id": child._id },
    {
        $set: {
            "children" : child
        }
    }
);

那也不行。 我引用了這篇文章: 用mongo query通過id更新數組元素

以及: http : //docs.mongodb.org/manual/reference/operator/update/positional/

但是我的查詢無法正常工作。 我在這里缺少基本的東西嗎?

-編輯-

這是我根據父文檔進行查詢時的結果

db.category.findOne({ "_id" : "9dYgKdfFczgiRcNouij"});
{
        "title" : "ParentTest",
        "active" : true,
        "children" : [
                {
                        "_id" : ObjectId("680d55c6995ef6f0748278c2"),
                        "title" : "ChildTest",
                        "active" : true
                                            },
                {
                        "_id" : ObjectId("2b4469c1a4c8e086942a1233"),
                        "title" : "ChildTest2"
                        "active" : true
                }
        ],
        "_id" : "9dYgKdfFczgiRcNouij"
}

我正在將數據傳遞到服務器,例如... Method.call(“ UpdateCommand”,id,child);

變量ID是文檔的父ID,子ID是我提到的對象。

我使用child._id.toString()生成匹配的ObjectId(“ ...”);

因此,更具體地說:

db.category.update(
        { _id: id, "children._id": child._id.toString() },
        {
            $set: {
                "children.$.title": child.title,
                "children.$.active": child.active,
                "children.$.sort": child.sort,
                "children.$.uppercase": child.title.toUpperCase()
            }
        }
    );

但這行不通。 我想我的選擇器有問題,但是我可以使用具有相同方法的findOne()並返回正確的文檔,並使用$ elemMatch返回數組中指定的子項。

我可能會缺少任何東西嗎? 我已經通過console.log運行了所有的值,以確保我正在獲取它們,並且是。

因此,您的意思是您有一個像這樣的文檔:

{
    "_id": ObjectId("5430b55d214047b8ee55d40b"),
    "children": [
        { 
            "_id": ObjectID("16e7f7baa05c3a9d751363"),
            "title": "Testing",
            "sort": 2,
            "active": false 
        }
    }
}

或類似的東西,但至少有很多這樣的孩子。 只要您樂於用變量對象中的值更新“所有”項,那么“孩子”條目中的元素就不會有任何問題:

db.category.update(
    { "_id": ObjectId("5430b55d214047b8ee55d40b"), "children._id": child._id },
    { "$set": { "children.$": child }
)

這樣就可以替換整個元素。

如果您擔心要替換整個內容,則可能會有以下內容:

{
    "_id": ObjectId("5430b55d214047b8ee55d40b"),
    "children": [
        { 
            "_id": ObjectID("16e7f7baa05c3a9d751363"),
            "title": "Testing",
            "sort": 2,
            "active": false,
            "created": ISODate("2014-10-03T03:09:20.609Z")
        }
    }
}

然后,您可以處理對象的鍵以構造$set語句:

var update = { "$set": {} };

for ( var k in child ) {
    if ( k != "_id" )
        update["$set"]["children.$."+k] = child[k];
}

db.category.update(
    { "_id": ObjectId("5430b55d214047b8ee55d40b"), "children._id": child._id },
    update
);

它將處理就地更新,但不會覆蓋未提供的“創建”字段。

還要注意那里的ObjectId值周圍的引號'' ,但我希望這只是一個錯字,否則您需要eval()字符串才能獲得有效的對象。

這里的單個數組元素只是一個例子。 與查詢中的匹配元素相關的位置$運算符語法在這里很重要。 單個數組元素或數百個數組元素沒有區別。 只要您只更新數組的一個元素即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM