Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Mongodb 如何更新子文档并使用同一子文档中的值添加新字段?_Mongodb_Mql - Fatal编程技术网

Mongodb 如何更新子文档并使用同一子文档中的值添加新字段?

Mongodb 如何更新子文档并使用同一子文档中的值添加新字段?,mongodb,mql,Mongodb,Mql,我正在运行mongo DB版本4.4.5。 我收藏了以下文件: { "_id" : "601a597c9932756822d134cb", "certificate" : { "complete" : true, "validFromTimestamp" : NumberLong("1612126800000"),

我正在运行mongo DB版本4.4.5。 我收藏了以下文件:

{
    "_id" : "601a597c9932756822d134cb",
    "certificate" : {
        "complete" : true,
        "validFromTimestamp" : NumberLong("1612126800000"),
        "validToTimestamp" : NumberLong("1643576400000")
    }
}
我想更新记录,并在证书子文档中添加另一个字段
nominatedTimestamp
,该字段的值将与
certificate.validFromTimestamp
相同

我尝试了以下MQL查询

db.collection_name.update({
    "certificate.validFromTimestamp": {
        $exists: true
    },
    "certificate.nominatedTimestamp": {
        $exists: false
    }
}, {
    $set: {
        "certificate.nominatedTimestamp": "$certificate.validFromTimestamp"
    }
})
但是,结果(如下所示)是
certificate.nominatedTimestamp
是字符串
“$certificate.validFromTimestamp”
而不是预期值
NumberLong(“1612126800000”)


如何让它选择
NumberLong(“1612126800000”)

您不能在另一个字段中使用内部字段作为值,请尝试使用聚合管道进行更新,只需将更新部分封装在数组括号中,如
[{$set:{“certificate.nominatedTimestamp”:“$certificate.validFromTimestamp”}]
Use.@turivishal我已经尝试了你的建议,输出正如我所期望的那样是正确的,但是它只显示,实际上没有保存。我理解聚合的实际工作原理是这样的:它在不实际修改底层数据的情况下输出经过修改的文档db.collection_name.aggregate([{$match:{“certificate.validFromTimestamp”:{$exists:true},“certificate.nominatedTimestamp”:{$exists:false}},{$set:{“certificate.nominatedTimestamp”:“$certicate.validFromTimestamp”}])``您不需要使用聚合函数,只需要在更新查询中进行更改,只需要在更新部分中添加括号,请参见工作您的意思是这样的db.collection_name.update({“certificate.validFromTimestamp”:{$exists:true},“certificate.nominatedTimestamp”:{$exists:false},[{$set:{“certificate.nominatedTimestamp”:“$certificate.validFromTimestamp”})
{
    "_id" : "601a597c9932756822d134cb",
    "certificate" : {
        "complete" : true,
        "validFromTimestamp" : NumberLong("1612126800000"),
        "validToTimestamp" : NumberLong("1643576400000"),
        "nominatedTimestamp" : "$certificate.validFromTimestamp"
    }
}