如果可能的话,我不是100%,但我认为应该是。
我想更新文档,以便将字段(END)插入数组(INTERMISSIONS)。我认为我非常接近实现它,但是我遇到了错误或插入了字符串“ $ END”。
我有两个查询:
db.myCollection.findOneAndUpdate(
{"_id" : new ObjectId("...")},
{ '$push' : {'INTERMISSIONS' : '$END' } }
)
此操作已成功完成,但没有插入$ END值,而是插入了“ $ END”
db.myCollection.findOneAndUpdate(
{"_id" : new ObjectId("...")},
{ '$push' :
{'INTERMISSIONS' : {$first:"$END" }}
}
)
在这里,我尝试“强制” mongo将$ END识别为一个字段,但出现错误在“ INTERMISSIONS..START。$ first”中,以美元($)为前缀的字段“ $ first”为不适用于存储。
文档结构如下
{
"_id" : ObjectId("5f7dabb9c02c0000d2003ec2"),
"USUARIO" : "admin",
"START" : ISODate("2020-10-07T11:51:21Z"),
"INTERMISSIONS" : [ ],
"END" : ISODate("2020-10-08T09:39:27Z")
}
答案 0 :(得分:1)
使用运算符时,请检查其是否可以将表达式作为参数, 像这里的字段参考。
{ $push: { <field1>: <value1>, ... } }
MongoDB可以做更多的事情,而mongodb> = 4.2则可以使用聚合管道进行更新。
我给你命令,“ q”是查询,“ u”是更新管道, 您可以将其与任何支持mongodb> = 4.2
的驱动程序一起使用> use testdb
switched to db testdb
> db.testcoll.drop()
true
> db.testcoll.insert(
... {
... "_id" : "5f7dabb9c02c0000d2003ec2",
... "USUARIO" : "admin",
... "START" :ISODate("2020-10-07T11:51:21Z"),
... "INTERMISSIONS" : [ ],
... "END" : ISODate("2020-10-08T09:39:27Z")
... }
... )
WriteResult({ "nInserted" : 1 })
> db.runCommand(
... {
... "update": "testcoll",
... "updates": [
... {
... "q": {},
... "u": [
... {
... "$addFields": {
... "INTERMISSIONS": {
... "$concatArrays": [
... "$INTERMISSIONS",
... [
... "$END" //or use {"start" : "$END"},anything you want to add
... ]
... ]
... }
... }
... }
... ],
... "multi": false
... }
... ]
... }
... )
{ "n" : 1, "nModified" : 1, "ok" : 1 }
> db.testcoll.find({}).pretty();
{
"_id" : "5f7dabb9c02c0000d2003ec2",
"USUARIO" : "admin",
"START" : ISODate("2020-10-07T11:51:21Z"),
"INTERMISSIONS" : [
ISODate("2020-10-08T09:39:27Z")
],
"END" : ISODate("2020-10-08T09:39:27Z")
}