Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用MongoDB,如何使用变量中的对象更新数组中的对象?_Javascript_Mongodb_Mongodb Query - Fatal编程技术网

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非常有用