我有一份文件:
{ _id:ObjectID, list:Array }
该列表包含表单的元素(我将其称为listElement):
{ _id:ObjectID, time:Number }
我想更新2个特定listElements的时间子字段,每个listElements都有自己的不同值。我可以访问listElements的两个_id。
关于这个问题的一个相关的事情:将列表从Array转换为一个对象是谁的键是_id值会更好吗?所以我会做db.update((_id:“Document id”},{“list.423rfasf2q3.time”:200,“list.fjsdhfksjdh2432.time”:100})?
我不确定如何使用ObjectID作为键,但我想我可以将其串起并同时具有_id值,并且包含该listElement的键是相同的字符串。
答案 0 :(得分:2)
您无法使用两个不同的值更新两个文档,您需要将其作为两个单独的更新运行。
您不希望将数据放入键值中,最好将它们保留原样。没有好的方法来匹配$ exists之外的键值,甚至不支持通配符。因此,您必须获取ObjectId,将其转换为字符串,将其连接到密钥,然后查询该密钥存在的文档。将值放在数组中的文档中要容易得多。此外,没有办法在MongoDB中索引键值,因此如果要索引数据,则需要将其作为数据元素存储在数组中。
编辑以包含位置匹配示例
首先,插入两个文件
> db.test.insert( {list: [ {_id: new ObjectId(), time: 1234}, {_id: new ObjectId(), time: 4556} ] } )
>
证明他们都在那里
> db.test.find()
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [{ "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>
显示如果我们做一个普通的数组过滤器,我们得到数组的所有元素
> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")})
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>
证明我们可以使用$
运算符仅返回匹配的第一个数组元素
> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")}, {_id: 0, "list.$": 1})
{ "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 } ] }