Hoe kan ik alle objecten in een database vinden waarmee een veld van een object een substring bevat?
Als het veld A in een object van een verzameling is met een stringwaarde:
Ik wil alle objecten vinden in de DB “-database” waar A een substring bevat: “ABC DEF”.
Ik heb geprobeerd:
db.database.find({A: {$regex: '/^*(abc def)*$/''}})
maar werkte niet
update
Een echte string (in Unicode):
Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1
Nood naar alle vermeldingen met Star Wars
db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring
Antwoord 1, Autoriteit 100%
In plaats daarvan hiervan:
db.database.find({A: {$regex: '/^*(abc def)*$/''}})
U moet dit doen:
db.database.find({A: /abc def/i })
^ * is eigenlijk geen geldige syntaxis als ^ en $ ankers en niet iets dat herhaalbaar is. Je bedoelde waarschijnlijk ^. * Hier. Maar er is geen behoefte aan ^. * Omdat dat eenvoudig betekent “alles tot het personage volgende” en (abc def) * betekent “0 of meer keren” ABC DEF “, maar het moet aan het einde van de touw zijn, Vanwege je $. De “I” aan het einde is om het ongevoelig te maken.
Antwoord 2, Autoriteit 61%
Gebruik gewoon de string “Star Wars” en $regex
doet de rest
db.test.find({A: {$regex: 'Star Wars'}})
Antwoord 3, Autoriteit 10%
$regex
is te duur / traag op grote collecties.
Ik zou willen voorstellen om aggregatiekader en $ indexofcp te doen .
db.test.aggregate([{$match:
{$expr: { $gt: [{ $indexOfCP: [ "$A", "Star Wars" ] }, -1]}}
}, {$project: {A:1}}])
Voor Case-Ongevoelige Zoeken kunt u $toUpper
aan de mix toevoegen en zoeken naar STAR WARS
.
Antwoord 4, Autoriteit 4%
Dit werkte voor mij:
db.test.find({"A": {'$regex': '.*star wars.*'}})
Antwoord 5
// executes, name LIKE john and only selecting the "name" and "friends" fields
db.collection.find({ name: /john/i }, 'name friends').exec();
// passing options
db.collection.find({ name: /john/i }, null, { skip: 10 }).exec();
Antwoord 6
Deze gebruikt de aggregatie-syntaxis:
db.movies.aggregate([
{$match:
{
title: {$regex: 'Star'}
}
}
] )