Javascript 使用MongoDB,如何使用变量中的对象更新数组中的对象?
我已将对象指定给变量,例如:Javascript 使用MongoDB,如何使用变量中的对象更新数组中的对象?,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我已将对象指定给变量,例如: var child = { { _id: 'ObjectID("16e7f7baa05c3a9d751363")', title: 'Testing', sort: 3, active: true } 以下内容不起作用,老实说,我不确定我遗漏了什么: db.category.update( { _id: "thisistheparentdocumentsid", "chil
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
}
}
);
那也不行。我引用了这篇文章:
以及:
但我的查询不起作用。我是不是错过了一些基本的东西
---编辑---
以下是基于父文档进行查询时的结果
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"
}
我正在向服务器传递数据,例如。。。方法调用(“UpdateCommand”,id,child)
变量id是文档的父id,子id是我提到的对象
我使用child.\u 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”),
“儿童”:[
{
“_id”:ObjectID(“16e7f7baa05c3a9d751363”),
“标题”:“测试”,
“排序”:2,
“活动”:错误
}
}
}
或者类似的东西,但至少有一个这样的子数组。只要您愿意更新“all”,如果“child”条目中的元素与变量对象中的值相同,那么这没有什么问题:
db.category.update(
{u id:ObjectId(“5430b55d214047b8ee55d40b”),“children.\u id:children.\u id},
{“$set”:{“children.$”:child}
)
这将取代整个元素的位置
如果您担心替换可能包含以下内容的整个内容:
{
“_id”:ObjectId(“5430b55d214047b8ee55d40b”),
“儿童”:[
{
“_id”:ObjectID(“16e7f7baa05c3a9d751363”),
“标题”:“测试”,
“排序”:2,
“主动”:假,
“已创建”:ISODate(“2014-10-03T03:09:20.609Z”)
}
}
}
然后,您可以处理对象的键来构造$set
语句:
var update={“$set”:{};
for(变量k在子对象中){
如果(k!=“_id”)
更新[“$set”][“children.$”+k]=child[k];
}
db.category.update(
{u id:ObjectId(“5430b55d214047b8ee55d40b”),“children.\u id:children.\u id},
更新
);
将就地处理更新,但不会覆盖未提供的“已创建”字段
还要注意在ObjectId
值周围的引号'
,但我希望这只是一个输入错误,否则需要eval()
字符串才能获得有效的对象
这里的单个数组元素只是一个例子。这里重要的是查询中匹配元素的运算符语法。单个数组元素和数百个数组元素没有区别。只要您只更新数组中的一个元素。我只是在问题的底部添加了更多细节,几乎是同时添加的回答的时间到了。现在正在阅读你的答案,但是如果你愿意查看我的更新吗?@user1447679已经看到了。数组中有多少元素并不重要。我自己的修订版反映了这一点。如果你的parentId是字符串(奇怪的是,你在这里混合类型)然后它是一个字符串。在通过服务器上的更新方法发送子对象之前,我正在记录子对象,它看起来是这样的:对象{u id:“ObjectID”(“19636533c66b0fd89f72f4b1”)”,标题:“Testing”,排序:2,活动:true}将ObjectID用引号括起来似乎不正确吗?我想知道它是否作为字符串发送。@user1447679是的,将其用引号括起来是不正确的,因为这意味着它只是一个字符串。因为您实际上看起来有“real”数据中的ObjectId值您需要用
client.\u id=eval(client.\u id)之类的东西处理字符串
为了将其转换为真正的ObjectId值。您首先应该真正了解是什么代码将其生成为字符串。再次感谢您。我将您的答案标记为正确。似乎我遇到了与我使用的框架(MeteorJS)相关的一些其他问题以及它目前如何处理传统的ObjectID。在尝试了你的上一个建议之后,我得到了ReferenceError:ObjectID没有定义,这让我得出了这样的结论:我将在这方面做更多的工作,但这必须是个问题。谢谢你…非常感谢你不断的评论和你的详细答案。你在答案中的详细信息是V非常有用