我只是在日期介于两个日期和下一句之间时才尝试更新:
db.periodo.update(
{"id_linea" : id_linea, "id_contexto" : id_contexto,$min: { "fecha_hora_inicio": fecha_desde }, $max: {"fecha_hora_inicio": fecha_hasta} },
{ $set: { "id_fase": id_fase } },
{ multi: true }
)
我的第一个问题是我的结构是:
id_linea
id_contexto
periodo
id_fase
fecha_hora_inicio
如果我想将periodo
中的日期作为条件使用,是否足以放置“fecha_hora_inicio
”或者我必须使用periodos.fecha_hora_inicio
引用?
当我尝试这两句话时,我得到以下失败:
error: {
"$err" : "Can't canonicalize query: BadValue unknown top level operator: $min",
"code" : 17287
}
我重新进行了咨询,因为我发现了错误:现在我的咨询是:
db.collection.update(
{"id_linea" : id_linea, "id_contexto" : id_contexto }, { $min: { "periodos.fecha_hora_inicio": fecha_desde }} , {$max: {"periodos.fecha_hora_inicio": fecha_hasta}} ,
{ $set: { "id_fase": id_fase }},
{ multi: true })
}
当我在robomongo中尝试使用值时,例如:
db.grupo_periodo.find(
{"id_linea" : 145, "id_contexto" : 151 }, { $min: { "periodos.fecha_hora_inicio": 2015-04-16 16:51:34 }} , {$max: {"periodos.fecha_hora_inicio": 2015-04-27 16:51:34 }}
}
我找到错误:第3行:意外号码
答案 0 :(得分:1)
我的第一个回答后的一些主要编辑。
grupo_periodo
集合中文档的结构如下:
{
id_linea: 145,
id_contexto: 151,
periodo: [
{
fecha_hora_inicio: new Date(2014, 10, 10),
id_fase: 'f'
},
{
fecha_hora_inicio: new Date(2014, 9, 10),
id_fase: 'f'
}
]
}
你想要更新" id_fase" " periodo"符合某个日期范围的对象。
您要找的是"positional $ update"。
这是一个完整的例子来了解这项工作:
db.grupo_periodo.insert({
id_linea: 145,
id_contexto: 151,
periodo: [
{
fecha_hora_inicio: new Date(2014, 10, 10),
id_fase: 'f'
},
{
fecha_hora_inicio: new Date(2014, 9, 10),
id_fase: 'f'
}
]
});
db.grupo_periodo.insert({
id_linea: 145,
id_contexto: 151,
id_fase: 'f',
periodo: [
{
fecha_hora_inicio: new Date(2014, 10, 10),
id_fase: 'f'
},
{
fecha_hora_inicio: new Date(2014, 6, 10),
id_fase: 'f'
}
]
});
db.grupo_periodo.insert({
id_linea: 145,
id_contexto: 151,
id_fase: 'f',
periodo: [
{
fecha_hora_inicio: new Date(2014, 6, 10),
id_fase: 'f'
}
]
});
var query = {
id_linea: 145,
id_contexto: 151,
'periodo.fecha_hora_inicio': {
$gt: new Date(2014, 6, 1),
$lt: new Date(2014, 6, 30)
}
};
//let's update all "periodo" elements in the arrays matching the query:
db.grupo_periodo.update(query, {
$set: {
'periodo.$.id_fase': 'updated'
}
}, {
multi: true
});
//now query:
db.grupo_periodo.find(query)
上一次查询的结果是:
{
"_id" : ObjectId("5538f5dacae6e0da9298ec4b"),
"id_linea" : 145,
"id_contexto" : 151,
"id_fase" : "f",
"periodo" : [
{
"fecha_hora_inicio" : ISODate("2014-11-10T03:00:00Z"),
"id_fase" : "updated"
},
{
"fecha_hora_inicio" : ISODate("2014-07-10T03:00:00Z"),
"id_fase" : "f"
}
]
}
{
"_id" : ObjectId("5538f5dbcae6e0da9298ec4c"),
"id_linea" : 145,
"id_contexto" : 151,
"id_fase" : "f",
"periodo" : [
{
"fecha_hora_inicio" : ISODate("2014-07-10T03:00:00Z"),
"id_fase" : "updated"
}
]
}
显示特定periodo
文档已更新id_fase
。
答案 1 :(得分:0)
if(collection !=null){
db.collection.update(
{"id_linea" : id_linea, "id_contexto" : id_contexto , periodos: { $elemMatch: { "fecha_hora_inicio": { $lte: fecha_hasta }, fecha_hora_fin: { $gt: fecha_desde } }}} ,
{ $set: { "periodos.$.id_fase": id_fase }},
{ multi: true })
}
现在一切都很完美。