[英]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.