-
有点但并非最佳。
-
应该是这样的,所以在
_id
键:
db.sample.createIndex({ "_id.userId": 1, "timestamp": 1 })
-
使用
$set
操作员并停止等待您的文档:
db.sample.update(
{
"_id.userId": "sample",
"firstTimestamp": { "$gt": 100 }
},
{
"$set": { "otherfield": "cfg" }
}
)
但实际上,您的数据“应该”是这样的:
{
"_id": "sample",
"firstTimestamp": 200,
"otherfield2": "sam"
}
并更新如下:
db.sample.update(
{
"_id.userId": "sample",
"firstTimestamp": { "$gt": 100 }
},
{
"$set": {
"fistTimetamp": 100,
"otherfield2": "efg"
}
}
)
或者,如果您坚持认为“_id”和“firstTimestamp”以外的字段将发生很大变化,那么不如这样做:
{
"_id": "sample",
"firstTimestamp": 200,
"data": {
"otherfield2": "sam"
}
}
如果您只想替换数据,请执行以下操作:
db.sample.update(
{
"_id.userId": "sample",
"firstTimestamp": { "$gt": 100 }
},
{
"$set": {
"fistTimetamp": 100,
"data": {
"overwritingField": "efg"
}
}
}
)
如果您愿意,可以将“数据”替换为整个对象,或者只更新一个键:
db.sample.update(
{
"_id.userId": "sample",
"firstTimestamp": { "$gt": 100 }
},
{
"$set": {
"fistTimetamp": 100,
"data.newfield": "efg"
}
}
)
在所有情况下,尝试使用操作符,而不是替换整个对象,因为它通常会导致更多的流量和更多的服务器负载。
但总的来说,这里有意义的是,“userId”部分“应该”是索引中缩小结果范围最多的部分。所以它肯定在时间戳之前,时间戳应该有更多可能的值。
复合主键很好,但请确保实际使用它们。单个值没有任何意义,只能分配给
_身份证号码
。如果您可以在这里只查询它们键的一个字段,那么您可能不需要复合对象作为主键。
你的
_身份证号码
在更新中,建议您获得与
_身份证号码
因此,它不是具有其他键的复合字段。在这种情况下,它应该只是
_身份证号码
它本身
同样,“范围”是可以的,但再次考虑您正在尝试匹配单个文档(好吧,您没有在任何地方提到“多”),因此再次询问为什么需要它,然后要么进行精确匹配,要么“至少”设置上限。
这个
$套
将“仅”更新您指定的字段。我认为您在键入问题时出错了,因为“update”部分的语法无效。但无论如何都要使用更新运算符,因为它们通过发送单个字段或仅发送您要更新的字段来发送较少的流量。