在产品系列中,我有一个recentviews
数组,其中包含2个字段viewedBy
& viewedDate
。
我正在使用数组中的$push
新元素,所以我使用下面的查询: -
db.produts.update( { _id: 'ObjectId("536c55bf9c8fb24c21000095")' },
{ $push: { recentviews: [ { viewedby: 'xyz', vieweddate: ISODate("2014-05-09T04:12:47.907Z") } ] } }
)
以上查询有什么问题?
此外,如果记录已经存在,例如,如果已经有viewedby
xyz
的记录,我需要更新记录,vieweddate
。
答案 0 :(得分:1)
{ _id: 'ObjectId("536c55bf9c8fb24c21000095")' }
应该没有引号,因为它被引用为字符串而不是objectId,它不等于你的主键。
{ _id: ObjectId("536c55bf9c8fb24c21000095") }
x1:PRIMARY> typeof( 'ObjectId("536c55bf9c8fb24c21000095")' )
string
x1:PRIMARY> typeof( ObjectId("536c55bf9c8fb24c21000095") )
object
答案 1 :(得分:1)
您无需指定括号[]
:
db.produts.update(
{ _id: ObjectId("536c55bf9c8fb24c21000095") },
{
"$push": {
"recentviews": {
"viewedby": "xyz",
"vieweddate": ISODate("2014-05-09T04:12:47.907Z")
}
}
}
)
因此,当向数组添加新的子文档时,它只是以这种方式指定并添加到左侧提到的数组中。
此外,引用的ObjectId
值会阻止.update()
进行匹配。