今天碰到一個問題,當我在update數據的時候想使用upsert功能,發現插入的數據並沒有過濾條件中$or的部分,如下:
db.msg.update(
{
“type”: “u”,
“$or”: [
{“from”: 1, “to”: 2},
{“from”: 2, “to”: 1}
]
},
{
“$push”: {
“message”: {
“data”: “holla”,
“status”: false,
“time”: new Date()
}
}
},
true,
true
);
本來希望的是:如果發現msg集合中如果沒有對應文檔,則插入,例如上麵的這條更新(假設當前集合中不存在from:1,to:2的這個文檔),執行完後msg集合中應當出現下麵這個文檔:
{
"from": 1,
"to": 2,
"type": "u",
"message": [
{
“data”: “holla”,
“status”: false,
“time”: ISODate("2014-02-12T01:50:40.866Z")
}
]
}
可實際情況是插入的數據中並不會包含$or部分的條件,請問有沒有解決方案?
$upsert目前(2.4)是不支援$and和$or的,據說2.6支持。請參閱官方issues:
upsert
本來就是不可靠的方法,manual 上也寫的很清楚於是被你無視了?