每個文檔都有2個日期,修改和同步。我想找到那些修改了>同步,或同步不存在。在我的集合中比較MongoDB中的兩個日期字段
我試圖
{'modified': { $gt : 'sync' }}
,但它沒有顯示我的預期。有任何想法嗎?
感謝
每個文檔都有2個日期,修改和同步。我想找到那些修改了>同步,或同步不存在。在我的集合中比較MongoDB中的兩個日期字段
我試圖
{'modified': { $gt : 'sync' }}
,但它沒有顯示我的預期。有任何想法嗎?
感謝
您無法將字段與正常查詢匹配的其他字段的值進行比較。但是,你可以用聚合框架做到這一點:
db.so.aggregate([
{ $match: …your normal other query… },
{ $match: { $eq: [ '$modified', '$sync' ] } }
]);
我把......你的正常的其他查詢......在那裏,你可以使該位使用索引。所以,如果你想爲僅文檔做到這一點,其中name
場charles
你可以這樣做:
db.so.ensureIndex({ name: 1 });
db.so.aggregate([
{ $match: { name: 'charles' } },
{ $project: {
modified: 1,
sync: 1,
name: 1,
eq: { $cond: [ { $gt: [ '$modified', '$sync' ] }, 1, 0 ] }
} },
{ $match: { eq: 1 } }
]);
隨着輸入:
{ "_id" : ObjectId("520276459bf0f0f3a6e4589c"), "modified" : 73845345, "sync" : 73234 }
{ "_id" : ObjectId("5202764f9bf0f0f3a6e4589d"), "modified" : 4, "sync" : 4 }
{ "_id" : ObjectId("5202765b9bf0f0f3a6e4589e"), "modified" : 4, "sync" : 4, "name" : "charles" }
{ "_id" : ObjectId("5202765e9bf0f0f3a6e4589f"), "modified" : 4, "sync" : 45, "name" : "charles" }
{ "_id" : ObjectId("520276949bf0f0f3a6e458a1"), "modified" : 46, "sync" : 45, "name" : "charles" }
這將返回:
{
"result" : [
{
"_id" : ObjectId("520276949bf0f0f3a6e458a1"),
"modified" : 46,
"sync" : 45,
"name" : "charles",
"eq" : 1
}
],
"ok" : 1
}
如果您想要更多的領域,你需要將它們添加到$project
。
眼下查詢試圖返回所有結果使得modified
場比字'sync'
更大。嘗試擺脫sync
周圍的報價,看看是否能解決任何問題。否則,我做了一點研究,發現this question。你試圖做的事情可能無法在單個查詢中實現,但是一旦從數據庫中提取所有內容,就應該能夠操縱數據。
謝謝@ gr3co,我試圖避免聚合,但似乎是唯一的出路... :( –
要解決無結塊這個問題上改變你的查詢到這一點: {'modified': { $gt : ISODate(this.sync) }}
只需
db.collection.find({$where:"this.modified>this.sync"})
例
Kobkrits-MacBook-Pro-2:~ kobkrit$ mongo
MongoDB shell version: 3.2.3
connecting to: test
> db.time.insert({d1:new Date(), d2: new Date(new Date().getTime()+10000)})
WriteResult({ "nInserted" : 1 })
> db.time.find()
{ "_id" : ObjectId("577a619493653ac93093883f"), "d1" : ISODate("2016-07-04T13:16:04.167Z"), "d2" : ISODate("2016-07-04T13:16:14.167Z") }
> db.time.find({$where:"this.d1<this.d2"})
{ "_id" : ObjectId("577a619493653ac93093883f"), "d1" : ISODate("2016-07-04T13:16:04.167Z"), "d2" : ISODate("2016-07-04T13:16:14.167Z") }
> db.time.find({$where:"this.d1>this.d2"})
> db.time.find({$where:"this.d1==this.d2"})
>
使用JavaScript,使用的foreach和轉換日期爲toDateString()一致
db.ledgers.find({}).forEach(function(item){
if(item.fromdate.toDateString() == item.todate.toDateString())
{
printjson(item)
}
})
謝謝你們,aggr和查詢都應該工作。 –
儘管你應該避免使用'''''''''''變體,但它會通過Javascript。另外,請接受答案。 – Derick