2013-08-07 4 views
5

में दो दिनांक फ़ील्ड की तुलना करें प्रत्येक दस्तावेज़ में 2 तिथियां, संशोधित और सिंक होती है। मैं उन लोगों को ढूंढना चाहता हूं जो संशोधित> सिंक, या सिंक मौजूद नहीं है।मेरे संग्रह में MongoDB

मैं

{'modified': { $gt : 'sync' }} 

की कोशिश की लेकिन यह दिखा कि मैं क्या उम्मीद नहीं है। कोई विचार?

धन्यवाद

उत्तर

17

आप सामान्य क्वेरी मिलान के साथ किसी अन्य फ़ील्ड के मान वाले फ़ील्ड की तुलना नहीं कर सकते हैं। हालांकि, अगर आप एकत्रीकरण ढांचे के साथ ऐसा कर सकते हैं:

db.so.aggregate([ 
    { $match: …your normal other query… }, 
    { $match: { $eq: [ '$modified', '$sync' ] } } 
]); 

मैं ... डाल अपनी सामान्य अन्य प्रश्न ... वहाँ के रूप में आपको लगता है कि थोड़ा इंडेक्स का उपयोग कर सकते हैं। तो अगर आप केवल दस्तावेज़ों के लिए यह करने के लिए जहां name क्षेत्र है चाहता हूँ charles आप कर सकते हैं:

{ "_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" } 

यह रिटर्न:

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 } } 
]); 
इनपुट के साथ

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("520276949bf0f0f3a6e458a1"), 
      "modified" : 46, 
      "sync" : 45, 
      "name" : "charles", 
      "eq" : 1 
     } 
    ], 
    "ok" : 1 
} 

आप तो किसी और फ़ील्ड चाहते हैं, आपको उन्हें $project में जोड़ना होगा।

+0

धन्यवाद दोस्तों, दोनों aggr और क्वेरी काम करना चाहिए। –

+1

आपको वास्तव में '' $ जहां 'संस्करण से बचना चाहिए, क्योंकि यह जावास्क्रिप्ट के माध्यम से जाता है। इसके अलावा, कृपया उत्तर स्वीकार करें। – Derick

-1

अभी आपकी क्वेरी वापस जाने के लिए सभी परिणाम ऐसी है कि modified क्षेत्र शब्द 'sync' से अधिक है कोशिश कर रहा है। sync के आसपास उद्धरणों से छुटकारा पाने का प्रयास करें और देखें कि क्या कुछ भी ठीक करता है या नहीं। अन्यथा, मैंने थोड़ा सा शोध किया और this question पाया। आप जो भी करने का प्रयास कर रहे हैं, वह एक ही प्रश्न में संभव नहीं हो सकता है, लेकिन डेटाबेस से सबकुछ खींचने के बाद आपको अपने डेटा में हेरफेर करने में सक्षम होना चाहिए।

+0

धन्यवाद @ gr3co, मैं एकत्रीकरण से बचने की कोशिश कर रहा था लेकिन आगे एकमात्र रास्ता लगता है ... :( –

-1

एकत्रीकरण के बिना इस समस्या को हल करने के लिए इस के लिए आपकी क्वेरी को बदलें: {'modified': { $gt : ISODate(this.sync) }}

1
सीधे शब्दों में

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"}) 
> 
0

उपयोग जावास्क्रिप्ट, foreach का उपयोग और toDateString करने के लिए तिथि परिवर्तित()

db.ledgers.find({}).forEach(function(item){ 

    if(item.fromdate.toDateString() == item.todate.toDateString()) 
    { 
     printjson(item) 
    } 
}) 
संबंधित मुद्दे