Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 45

91
votes
answers
16 views
+10

Using findOne in mongodb to get element with max id

I am trying to retrieve one element from a mongo collection, the one with the greatest _id field. I know this can be done by querying:

db.collection.find().sort({_id: -1}).limit(1)

But it kind of seems unelegant and I was wondering whether there is a way to get that specific element using findOne()

Note: I want to do this because, from what I've read in ObjectId, the first bytes correspond to the miliseconds since the Epoch and thus, the last element being inserted will have the greatest _id. Is there any other way to retrieve the last element inserted in a collection?

up vote 81 down vote accepted favorite
沙发
+810
+50

You should use find, like you already are, and not aggregation which will be slower since it needs to scan all the values of _id fields to figure out the max.

As comments pointed out there is no difference between using find() and findOne() - functionally or elegance-wise. In fact, findOne in the shell (and in the drivers which implement it) is defined in terms of find (with limit -1 and with pretty print in the shell).

If you really want to do the equivalent of

db.collection.find().sort({_id:-1}).limit(1).pretty()

as findOne you can do it with this syntax:

db.collection.findOne({$query:{},$orderby:{_id:-1}})

謝謝您的回答!我預計我的查詢會有一些更好的實現,而不是只是為了得到1個結果而調用find,但是如果findOne只是一個優雅的發現,我想這確實沒有區別。 - 豪爾赫於2014年3月2日0:25

正確。和聚合(你接受為正確答案)實際上是一個非常錯誤的答案,因為它將掃描所有_id值,其中find使用_id索引僅掃描單個值。 - Asya Kamsky 2014年3月2日0:30

自3.2版以來,$ orderby運算符已棄用。請改用cursor.sort()。 - Vadim 2016年5月27日4:59

@Avishay絕對沒有理由認為你說的是真的。如果找不到匹配的findOne並且找到限制1絕對相同,就像找到匹配一樣。 - Asya Kamsky 2016年8月8日13:53

@Avishay你鏈接到的博客文章是非常錯誤的 - 它正在構建find()但實際上沒有檢查是否有任何匹配。有評論可以解釋為什麼這是錯誤的。 - Asya Kamsky 2016年8月8日14:05

+90

You can get max _id using aggregation of mongodb. Find and sort may overkill's.

db.myCollection.aggregate({
    $group: {
        _id: '',
        last: {
            $max: "$_id"
        }
    }
});

這比find()更優雅?它永遠不會更快,在大多數情況下可能會慢得多。 - Asya Kamsky 2014年3月1日23:33

實際上,它不是查找和排序 - 使用sort查找使用索引來立即選擇單個值。您的聚合答案必須掃描整個值範圍)。 - Asya Kamsky 2014年3月2日0:31

[引證需要] - joeytwiddle 2016年4月12日4:02

+10

with PHP driver (mongodb)
using findOne()

$filter=[];
$options = ['sort' => ['_id' => -1]]; // -1 is for DESC
$result = $collection->findOne(filter, $options);
$maxAge = $result['age']
0
import pymongo

tonystark = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = tonystark["tonystark_db"]
savings = mydb["customers"]

x = savings.find().sort("_id")
for s in x:
    print(s)

歡迎來到SO,謝謝你的回答!您能解釋一下這是如何工作的,以及為什麼這是解決問題的有效方法? - ggorlen 4月21日凌晨1:30

-10
$maxId="";

$Cursor =$collection->find();

foreach($cursor as $document) { 
    $maxid =max($arr=(array($document['id'])));
}

print_r($maxid+1);
0
votes
answers
26 views
+10

如何在Apache MongoDB中存儲Apache Sling內容?

1

我是Java和Apache Sling的新手。我一直在試圖用MongoDB的鏈接吊帶和這些是我迄今所做的:如何在Apache MongoDB中存儲Apache Sling內容?

  1. 我在吊帶控制檯配置NoSQL MongoDB Resource Provider

NoSQL config

  • 然後Oak Document Node Store Service
  • Oak config

    1. 最後,我運行java -Dsling.run.modes=oak_mongo -jar org.apache .sling.launchpad-9.jar -c sling -f -以mongodb模式運行吊索啓動板。這是結果:

    Command Prompt

    其結果是,一個名爲 「吊」 在MongoDB中被創造,我可以通過ROBO-3T(一MongoDB的管理工具)看到數據庫:

    MongoDB

    使用下面的插件,通過我的Maven的應用程序創建一些內容和吊帶部署之後,我能看到我的新創建的節點和資源的吊帶瀏覽器(http://localhost:8080/bin/browser.html):

    <build> 
        <plugins> 
         <plugin> 
          <groupId>org.apache.felix</groupId> 
          <artifactId>maven-bundle-plugin</artifactId> 
          <extensions>true</extensions> 
          <version>3.3.0</version> 
          <configuration> 
           <instructions> 
            <Sling-Nodetypes> 
             SLING-INF/nodetypes/nodetypes.cnd 
            </Sling-Nodetypes> 
            <Sling-Initial-Content> 
             SLING-INF/scripts;overwrite:=true;uninstall:=true;path:=/apps/test1/nodes, 
             SLING-INF/content;overwrite:=true;uninstall:=true;path:=/content/test1 
            </Sling-Initial-Content> 
           </instructions> 
          </configuration> 
         </plugin> 
        </plugins> 
    </build> 
    

    但是,我需要將所有內容存儲在MongoDB數據庫中,但目前沒有任何存儲在數據庫中。我怎樣才能做到這一點?

    沙发
    0
    1

    最簡單的方法是使用以下參數啓動Sling Launchpad:-Dsling.run.modes=oak-mongo。這將確保Oak被配置爲使用Mongo。您必須刪除sling目錄,否則運行模式將不會更改。


    什麼你與你試圖做的是:

    1. 增加其陰影在庫根當前一個新的資源提供者。我不確定實際的效果,它可能會被拒絕 - 請參閱吊索錯誤日誌
    2. 配置一個使用Mongo的新的Oak NodeStoreService - 但它可能沒有被拾取,因爲已經有一個NodeStoreService正在運行 - 吊索需要一個啓動。
    +0

    非常感謝羅伯特,刪除索具目錄做到了這個把戲:) –

    +0

    @Bahman_Aries很高興聽到它的工作,享受Sling ;-) –

    0
    votes
    answers
    16 views
    +10

    Mongodb update deeply nested subdocument

    I have a document structure that is deeply nested, like this:

    {id: 1, 
     forecasts: [ { 
                 forecast_id: 123, 
                 name: "Forecast 1", 
                 levels: [ 
                    { level: "proven", 
                      configs: [
                                { 
                                  config: "Custom 1",
                                  variables: [{ x: 1, y:2, z:3}]
                                }, 
                                { 
                                  config: "Custom 2",
                                  variables: [{ x: 10, y:20, z:30}]
                                }, 
                        ]
                    }, 
                    { level: "likely", 
                      configs: [
                                { 
                                  config: "Custom 1",
                                  variables: [{ x: 1, y:2, z:3}]
                                }, 
                                { 
                                  config: "Custom 2",
                                  variables: [{ x: 10, y:20, z:30}]
                                }, 
                        ]
                    }
                ]
            }, 
        ]
    
    }
    

    I'm trying to update the collection to insert a new config, that looks like this:

    newdata =  {
      config: "Custom 1", 
      variables: [{ x: 111, y:2222, z:3333}]
    }
    

    I'm trying something like this in mongo (in Python):

    db.myCollection.update({"id": 1, 
                            "forecasts.forecast-id": 123, 
                            "forecasts.levels.level": "proven", 
                            "forecasts.levels.configs.config": "Custom 1"
                             },
                             {"$set": {"forecasts.$.levels.$.configs.$": newData}}
                          )
    

    I'm getting "Cannot apply the positional operator without a corresponding query field containing an array" error though. What is the proper way to do this in mongo? This is mongo v2.4.1.

    0
    votes
    answers
    23 views
    +10

    MongoDB的聚集查詢 - 集團合計字段錯誤

    0

    我有一個MongoDB的集合,一個文件如 -MongoDB的聚集查詢 - 集團合計字段錯誤

    { 
        "_id" : ObjectId("5a187babdbf0a03cdca0d0bc"), 
        "aggregationDate" : "2017-10-31", 
        "ipaddress" : "10.65.66.184", 
        "first" : { 
         "count" : 3 
        }, 
        "second" : { 
         "count" : 2 
        }, 
        "third" : { 
         "count" : 3 
        }, 
    } 
    

    大約有30000這樣的文件,與每天產生約1000個新的。我想顯示具有最高活動性的「ipaddress」,它被定義爲「first」,「second」和「third」的最高計數。

    我擡頭聚集查詢並寫了下面的一個 -

    db.collection.aggregate({ $group : { ipaddress: "$ipaddress", 
              max: { $max : [ "$first.count", "$second.count", "$third.count" }}}); 
    

    可惜我得到一個錯誤 -

    "errmsg" : "exception: the group aggregate field 'ipaddress' must be defined as an expression inside an object", 
    

    是否有人可以幫助我這個錯誤,並與寫作聚集查詢爲我的要求?由於

    +0

    你在尋找最高的第一和第二和第三或第一,第二和第三的最高總和?例如。具有{第一:10,第二:10,第三:10}的文檔可以具有最高的所有個體,但是{第一:200,第二:0,第三:0}在所述字段中具有更高的總和。 –

    +0

    @BuzzMoschetti第一,第二和第三的最高總和是我在尋找的 –

    沙发
    0
    0

    這應該做的伎倆。您也需要$add功能。

    db.foo.aggregate([ 
        {$group: {_id: "$ipaddress", 
          max: { $max: {$add: [ "$first.count", "$second.count", "$third.count"] } } 
          } 
        } 
    ]); 
    
    +0

    啊,是的!非常感謝.. :) –

    板凳
    0
    0

    是啊,那是因爲在$group管道不能有這樣的事情

    ipaddress: "$ipaddress" 
    

    領域ip地址必須由蓄電池操作員陪同。這裏的文檔是優秀看看here

    如果你的意思是按ip地址,那麼你必須把它寫這樣的:

    _id: "$ipaddress" 
    

    $max運營商不會以這種方式工作要麼。這是您在$project管道中使用它的方式,而不是在$group中。請看一看here

    所以,你的聚集將有看起來像這樣:

    db.collection.aggregate([ 
    { 
        $group: 
        { 
         _id: "$ipaddress", 
         max: { 
          $max: {first: "$first.count", second: "$second.count", third: "$third.count"} 
         } 
        } 
    } 
    ]) 
    
    89
    votes
    answers
    13 views
    +10

    How to do raw mongodb operations in mongoose?

    I'm asking this because when I write unit tests, I want to drop the test database and insert some initialize data, and also check the data in mongodb in testing. So I need raw operations to mongodb.

    How to do this in mongoose? What I can do now is just create the connection, and not find any document in mongoose's official site.

     var mongoose = require('mongoose');
     mongoose.connect('mongo://localhost/shuzu_test');
    
     // get the connection
     var conn = mongoose.connection;
    

    But how to:

    1. drop the database
    2. create a collection
    3. write some data to a collection
    4. query a collection
    5. drop a collection
    up vote 42 down vote accepted favorite
    沙发
    +420
    +50

    See the section on "Driver Access" in the docs: http://mongoosejs.com/

    Basically you can get access to the node-mongodb-native driver by doing YourModel.collection and then you can insert or remove or drop or whatever you need.

    There's not a doc, but with this approach you'll get access to everything in here: https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

    Edit:

    In your case you may want to skip using mongoose in your test suite and use the node-mongodb-native directly, or even write a simple mongodb shell script that can be run before your tests start.

    關於“直接使用mognodb-native”,我發現如果我在mongoose模式中定義索引,如果我使用mongodb-native直接插入一些數據,它們將無法正常工作。 - 自由風5月25日'12在7:41

    那很有意思。我認為ensureIndex是在啟動時運行的?嗯。啊,是的,但這是在你的測試套件中,所以它根本沒有進行Mongoose調用。 - Jamund Ferguson於2012年5月25日13:10

    我有一個複雜的MongoDB腳本,它從命令行運行如下:$ mongo mydb task.js由於我無法在服務器環境中運行shell腳本並需要安排上述任務,我想我可以運行Mongo腳本節點腳本。這是通過本地驅動程序實現的嗎? - Sam於12年12月26日凌晨3點18分

    這個答案指的是不太清楚的文檔。為什麼不直接編寫代碼並鏈接到文檔中的特定頁面。 - 卡爾莫里森2016年6月1日15:58

    我不再在該頁面上看到“駕駛員訪問”。 - Tanner Faulkner 2016年8月18日18:50

    +430

    You can run native mongodb commands by using mongoose.connection.db. This accesses the native MongoDB driver, and you don't need to create a model.

    An insert

    mongoose.connection.db.collection('userCollection').insert({
      username: 'user1',
      firstName: 'Steve',
      lastName: 'LastName', 
    });
    

    An update

    mongoose.connection.db.collection('userCollection').update(
      {someFilterProperty: true},
      {$set: {
         siteId: new mongoose.mongo.ObjectId('56cb91bdc5946f14678934ba'),
         hasNewSiteId: true}},
      {multi: true});
    });
    

    You can send every command specific to that database using the database connection db reference mongoose.connection.db.

    This is the mongoose API doc: http://mongoosejs.com/docs/api.html#connection_Connection-db

    我需要在db上運行命令'isMaster',但無法使用 - datdinhquoc 2016年12月28日11:30

    我認為這是本機驅動程序的最佳通用訪問方式。對於那些在原始Mongoose API文檔中搜索的人,這裡是Connection.prototype.db的鏈接:mongoosejs.com/docs/api.html#connection_Connection-db - edmundo096 17年3月16日17:11

    這應該是一個公認的答案! - Trung Le Nguyen Nhat,17年8月16日7:37

    如何打印查詢結果? - CodyBugstein 18年1月29日16:36

    +40

    use this to run raw operations in mongoose.

      Model_name.collection.insertMany(array, { ordered: false },function(err, success){
                console.log(success);
            });
    

    這個答案需要一個模型存在。問題是如何使用“原始mongodb”,這意味著用戶可能不希望增加模型的要求。 - 於2017年3月19日12:59放大了

    0
    votes
    answers
    32 views
    +10

    AWS Lambda回調被開放的mongodb連接阻塞了嗎?

    0

    我已經設置了一個AWS lambda來爲我做一些數據保存到MongoDB。我想重新使用連接,所以每次調用lambda時都不必創建新的連接。但是如果我打開db連接,Lambda處理程序的回調不起作用!AWS Lambda回調被開放的mongodb連接阻塞了嗎?

    有沒有什麼我做錯了多數民衆贊成創造這種??行爲?這是我的代碼:

    var MongoClient = require('mongodb').MongoClient 
    
    exports.handler = (event, context, callback) => { 
        MongoClient.connect(process.env.MONGOURL, function (err, database) { 
         //database.close(); 
         callback(null, "Successful db connection") 
        }); 
    } 
    
    +0

    [從文檔:(http://docs.aws.amazon.com/lambda/latest/dg/lambda-introduction.html)*「在你的lambda函數代碼的任何聲明(外例如,如果您的Lambda函數建立了數據庫連接,而不是重新建立連接,那麼原來的連接將在隨後的調用中使用。 「* –

    +0

    所以」簡單地說「**相同的答案**用於持久化和共享模塊化代碼(或函數)之間的連接,也適用於一般nodejs應用程序適用於此。請參閱[如何管理Node.js Web應用程序中的MongoDB連接?](https://stackoverflow.com/questions/10656574/how-do-i-manage-mongodb-connections-in-a-node-js- Web應用程序)。它只是你要實現的'getDB()'函數需要被聲明爲任何「處理器」代碼的「外部」,並且在處理程序中你只需獲取該連接的當前「實例」,這是事實「持久化」 。就像文檔說的一樣。 –

    +0

    @NeilLunn必須告訴Lambda不要等待事件循環爲空,而是要繼續並返回結果並凍結容器。 –

    沙发
    0
    1

    這是由於未設置context.callbackWaitsForEmptyEventLoop = false而導致的。如果保留默認true,回調不會導致Lambda返回響應,因爲您的數據庫連接將事件循環保持爲空。

    http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

    +0

    完美!謝謝! – AlexKogan

    0
    votes
    answers
    31 views
    +10

    在貓鼬比較對象以日期時間

    0

    這是我的MongoDB架構:在貓鼬比較對象以日期時間

    var mongoose = require('mongoose'); 
    var Schema = mongoose.Schema; 
    
    var DogSchema = new Schema({ 
        id_user: { 
         type: String, 
         required:true 
        }, 
        name: { 
         type: String, 
         required:true 
        }, 
        imei: { 
         type: String, 
         required:true, 
         unique:true 
        }, 
        position: [{ 
         lat: {type: Number, required:true}, 
         lng: {type: Number, required:true}, 
         date: {type: Date, required:true} 
        }], 
        teams: [{ 
         code: {type:String,required:true} 
        }] 
    }); 
    
    module.exports = mongoose.model('Dog', DogSchema); 
    

    我想找到一個特定的日期範圍內只有位置。 我試圖使用查詢:

    db.dogs.find({"position.date" : { $gte : new Date("2017-11-25T00:00:00.000Z") , $lt : new Date("2017-11-26T00:00:00.000Z")}}) 
    

    但是,如果我找到匹配查詢的位置,數據庫返回的所有文件。我怎樣才能得到那個日期範圍的職位?

    沙发
    0
    0

    要爲子文檔中查詢中指定的條件,你必須使用.populate()match

    db.dogs.find({}). 
        populate({ 
        path: "position", 
        match: { date: { $gte : new Date("2017-11-25T00:00:00.000Z") , $lt : new Date("2017-11-26T00:00:00.000Z") }}, 
        // Explicitly exclude `_id` if needed 
        select: '-_id date', 
        }). 
        exec() 
    

    看到Mongoose Query Population

    120
    votes
    answers
    28 views
    +10

    How do I query for distinct values in Mongoose?

    I have a problem where I want to be able to get all the unique cities for a collection, and my code looks something like this:

    var mongoose = require("mongoose"),
    Schema = mongoose.Schema;
    
    var PersonSchema = new Schema({
        name: String,
        born_in_city: String
    });
    var Person = mongoose.model('Person', PersonSchema);
    

    In native MongoDb I could just do db.person.distinct("born_in_city"), but there doesn't seem to be anything equivalent for Mongoose. Is the only option to iterate over all of the documents myself to do this, or is there a better solution?

    In an attempt to use the underlying node-mongodb-native as suggested by the answerer I attempted to do this:

    mongoose.connection.db.collections(function(err, collections){
      collections[0].distinct('born_in_city', function( err, results ){
        console.log( err, results );
      });
    });
    

    However the results is empty and there's no error. I would also prefer to be able to fetch only the needed collection by name rather than have to filter what collections return if at all possible.

    up vote 101 down vote accepted favorite
    沙发
    +1010
    +50

    Just to give an update for Mongoose 3.x:

    MyModel.find().distinct('_id', function(error, ids) {
        // ids is an array of all ObjectIds
    });
    

    您也可以直接在模型上調用它。MyModel.distinct('_ id',{foo:'bar'},函數(錯誤,ids)... - JohnnyHK 12年9月13日在17:17

    我怎樣才能按ID排序結果? - Melki 2013年7月19日10:57

    從Mongoose Docs中的示例(mongoosejs.com/docs/api.html#query_Query-sort),我認為您可以編寫:MyModel.find({sort:{'_ id': - 1}})。 ('_id',函數(錯誤,ids){/ *處理結果* /}); - Risadinha 2013年7月19日15:56

    @Risadinha:它顯示:“排序不能與分開使用” - Anooj Krishnan G 5月5日'15在7:43

    然後對生成的id數組進行排序,只需使用javascript Array.prototype.sort():MyModel.distinct('_ id',function(error,ids){ids.sort(); ...}) - Aymeric Bouzy aybbyk 18年10月9日15:14

    +170

    In my program, this code works.

    Person.collection.distinct("born_in_city", function(error, results){
      console.log(results);
    });
    

    by node.js v0.4.7, mongoose 1.3.3

    這很棒,謝謝!:) - Kit Sunde 2011年5月20日3:03

    +20

    I read through the source code and the node-mongodb-native driver is what powers the class. So on the connection object. So after you have done mongoose.connect(mongodb://), you can give this a shot.

    if(mongoose.connections.length > 0) {
      var nativeconn = mongoose.connections[0].conn;
      nativeconn.person.distinct('born_in_city', function(error, results){
    
      });
    }
    

    謝謝你的建議。mongoose.connections [0] .conn對我來說是未定義的,但是我很確定mongoose.connection為活動連接返回相同的內容。雖然我不能像你建議的那樣使用mongoose.connection.person,但是我調用了mongoose.connection.db.collections(..),但是一旦我運行了collection.distinct(..),結果就是空的。我更新了我的問題以反映我迄今為止的嘗試。 - Kit Sunde 2011年5月19日2:43

    0
    votes
    answers
    21 views
    +10

    在MongoDb中獲取計算列

    1

    您好我正在使用MongoDb,因爲我需要一個計算列,同時檢索組的集合列表。集團收藏有members陣列,其中包含文件_idmember_id,member_type。我需要檢查當前用戶是否爲該組的管理員。如果member_type是1,那麼它是管理員,用戶也必須是members陣列的一部分。在MongoDb中獲取計算列

    館藏結構:

    //集合:user_groups

    { 
        "_id" : ObjectId("5a339d6cc2d708402ebe53e5"), 
        "group_description" : "desc", 
        "members" : [ 
         { 
          "member_id" : ObjectId("5a335b81d51ba494223227bb"), 
          "member_type" : 1, 
          "created_at" : ISODate("2017-12-15T15:31:16.566+05:30"), 
          "updated_at" : ISODate("2017-12-15T15:31:16.566+05:30"), 
          "_id" : ObjectId("5a339d6cc2d708402ebe53e6") 
         } 
        ], 
        "is_admin" : false 
        } 
    

    我用下面的查詢,但返回false,它應該返回true。

    db.user_groups.aggregate([{$match:{_id:ObjectId("5a339aaac2d708402ebe53e5")}}, 
    {$project:{members: 1,group_description:1,is_admin:{$cond:[{$and:[{$eq: 
    ['$members.member_type',1]},{$eq: 
    ['$members.member_id',ObjectId("5a335aaad51ba494223227bb")]}]},true,false]}}}]) 
    
    沙发
    0
    1

    您需要$unwind$members陣列爲你的代碼工作。如果members是嵌入式子文檔而不是嵌入式子文檔數組,您的代碼就可以工作。

    db.user_groups.aggregate([{ 
         $match: { 
          _id: ObjectId("5a339d6cc2d708402ebe53e5") 
         } 
        }, 
        { 
         $unwind:"$members" 
        }, 
        { 
         $project: { 
          members: 1, 
          group_description: 1, 
          is_admin: { 
           $cond: [{ 
            $and: [{ 
             $eq: ['$members.member_type', 1] 
            }, { 
             $eq: ['$members.member_id', ObjectId("5a335b81d51ba494223227bb")] 
            }] 
           }, true, false] 
          } 
         } 
        } 
    ]) 
    
    +0

    謝謝,它爲我工作,但我不確定'unwind'有什麼用處,它會降低查詢性能嗎? – Nirmal

    +0

    您需要使用'$ unwind',因爲您可以有多個成員。 '$ unwind'使陣列變平。我懷疑使用'$ unwind'時可能會有小的性能影響,但很可能可以忽略不計。 – Jaco

    2
    votes
    answers
    46 views
    +10

    How to remove duplicate contents? [closed]

    I've a classified website (in PHP and Mysql) where users can post their ads free of cost. But users often post duplicate ads. The script do not allow them to post exact duplicate contents, so they do this by changing one or two character.

    Is there any way to find the duplicate ad and alert the user (even if they modified some portion of the text)?

    My site is in PHP and Mysql. I'm using sphix for searching. Thinking of changing this to mongodb and apache solr.

    沙发
    +20

    Go and have a loot at

    Calculate the similarity between two strings http://php.net/manual/en/function.similar-text.php

    OR

    Calculate Levenshtein distance between two strings http://www.php.net/manual/en/function.levenshtein.php

    板凳
    0

    You can write a function which break the sentence into words and then match each words with the table and then find percentage of matching in database. Based on the percentage you can make the decision. For less database checking you can remove the common words and verbs, which you can store in a array. This is my personal opinion may be there are some other better techniques. But I must say it is a good question.

    地板
    0

    Levenstein distance, jarowinkler, plagiarism algorithms.. Look them them up on SO

    I would start with simple levenstein distance

    看起來需要一些手動質量控制。例如,兩個不同的用戶可以在同一條街道上為空置公寓發布廣告:25 Lake Ave和26 Lake Ave - 如果您使用Levenshtein距離,則可以將其標記為重複。然而,重複的帖子可能像25 Lake Ave和25 Lake Avenue,它們有更高的Levenshtein距離! - arun 2013年6月9日0:38