pretty - 聚合mongodb




如何用“like”查詢MongoDB? (20)

我想查詢一些像SQL like查詢:

select * 
from users 
where name like '%m%'

如何在MongoDB中做同樣的事情?
我找不到like documentations的操作員。


Like Query將如下所示

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

for scala ReactiveMongo api,

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]

MongoRegex已被棄用。
使用MongoDB \ BSON \ Regex

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor

FullName類似'last'與狀態=='待定'在兩個日期之間:

db.orders.find({
      createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
      $lt:ISODate("2017-05-05T10:08:16.111Z")},
      status:"Pending",
      fullName:/last/}).pretty();

狀態=='待定'和orderId LIKE'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();

似乎有理由同時使用javascript /regex_pattern/ pattern以及mongo {'$regex': 'regex_pattern'}模式。 請參閱: MongoBD RegEx語法限制

這不是一個完整的正則表達式教程,但是我看到上面高度投票含糊不清的帖子後,受到啟發來運行這些測試。

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }

你會在mongo中使用正則表達式。

例如: db.users.find({"name": /^m/})


你有2個選擇:

db.users.find({"name": /string/})

要么

db.users.find({"name": {"$regex": "string", "$options": "i"}})

第二個,你有更多的選擇,比如“我”在選項中使用大小寫不敏感。 關於“字符串”,你可以使用例如“ 。string。 ”(%string%)或者“string。*”(string%)和“。* string)(%string)如你所願。

請享用!


使用正則表達式匹配如下。 '我'顯示不區分大小寫。

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);

使用聚合子字符串搜索(使用索引!!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);

nodejs項目中使用貓鼬使用Like查詢

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });

在Go和mgo司機:

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

其中結果是尋求類型的結構實例


在SQL中,' like '查詢如下所示:

select * from users where name like '%m%'

在MongoDB控制台中,它看起來像這樣:

db.users.find({"name": /m/})     // Not JSON formatted

db.users.find({"name": /m/}).pretty()  // JSON formatted

在add pretty()方法會在所有產生格式化JSON結構的地方更具可讀性。


如果你使用PHP,你可以使用如下的MongoDB_DataObject包裝器:

$model = new MongoDB_DataObject();

$model->query("select * from users where name like '%m%'");

while($model->fetch()) {
    var_dump($model);
}

要么:

$model = new MongoDB_DataObject('users);

$model->whereAdd("name like '%m%'");

$model->find();

while($model->fetch()) {
    var_dump($model);
}

如果你正在使用Spring-Data Mongodb你可以這樣做:

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));

如果使用node.jsit說你可以寫這個:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

Also ,你可以這樣寫:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );

對於PHP Mongo來說。
我有幾個與php mongo類似的問題。 我發現連接正則表達式參數有助於在某些情況下PHP mongo查找字段開始 。 我想我會在這裡發布對更受歡迎的主題的貢獻

例如

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)

已經有很多答案。 我正在給正則表達式的字符串搜索提供不同類型的需求和解決方案。

你可以用正則表達式來包含單詞,比如like。 您也可以使用$options => i進行不區分大小寫的搜索

包含string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

不包含只有正則表達式的string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

確切的不區分大小寫的string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

string開始

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

將其保存為書籤,並為您可能需要的任何其他更改提供參考。



我找到了一個免費的工具來將MYSQL查詢翻譯成MongoDB。 http://www.querymongo.com/我查了幾個查詢。 因為我幾乎看到他們都是正確的。 據此,答案是

db.users.find({
    "name": "%m%"
});

那將是:

db.users.find({"name": /.*m.*/})

或者類似的:

db.users.find({"name": /m/})

你正在尋找某處包含“m”的東西(SQL的' % '運算符等同於Regexp的' .* '),而不是將某個“m”錨定到字符串的開頭。


db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

當我們搜索字符串模式時,總是最好使用上述模式,因為當我們不確定案例時。 希望有所幫助!





sql-like