当前文件
{
"_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
"cd" : 1406781202,
"op" : [
{
"fr" : "test test"
}
],
}
我想更新“op”,仅举例如下:
{
"_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
"cd" : 1406781202,
"op" : [
{
"fr" : "test test"
},
{
"hi" : "test 123",
},
{
"mp" : "test abc",
}
],
}
在上面的示例中,“fr”索引在更新之前存在,我添加了“hi”。
请让我知道查询?
这是实现这一目标的理想方式吗?即我使用索引fr,hi等将数据保存在“op”中,所以这个字段应该只是这样吗?
答案 0 :(得分:4)
我通常得到的是你似乎正在使用"值作为键"这是一种你不应该遵循的反模式。原来的帖子甚至没有显示阵列,但结构仍然没有好多了。
你应该有这样的东西:
{
"_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
"cd" : 1406781202,
"op" : [
{
"key": "fr", "value": "test test"
}
],
}
然后您可以按如下方式将元素推送到数组中:
db.collection.update(
{ "_id": ObjectId("53d9c7654dfe220f0e8b45bb") },
{
"$push": {
"op": {
"$each": [
{ "key": "hi", "value": "test 123" },
{ "key": "mp", "value": "test abc" }
]
}
}
}
)
通过这种方式,您只能为所有选项的集合创建一个索引。
db.collection.ensureIndex({ "op.key": 1 })
你也可以这样查询:
db.collection.find({ "op.key": "fr" })
而不是使用不能使用索引的运算符,例如 $exists
db.collection.find({ "op.fr": { "$exists": true } })
目前您将会遇到这种情况。
答案 1 :(得分:0)
db.collection.update({“_ id”:ObjectId(“53d9c7654dfe220f0e8b45bb”)},{$ set:{“op.hi”:“test 45”}})