您好,请帮帮我。 在mongodb,我有一个这样的集合:
data1= {
"string1":"abc",
"string2":"abcde"
}
data2= {
"string1":"abc",
"string2":"ftgr"
}
在查询之后我只想返回data1,因为它的string2
属性包含它的string1
属性的内容。我怎样才能做到这一点?我应该使用$ where还是使用正则表达式?如果有人可以指出小费,非常感谢。
答案 0 :(得分:2)
您可以install.packages("data.table")
library(data.table)
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
dt <-data.table(a,b)
>dt
a b
1: A 1
2: A 1
3: A 2
4: B 4
5: B 1
6: B 1
7: C 2
8: C 2
>unique(dt,by="a")
a b
1: A 1
2: B 4
3: C 2
为$where
创建RegExp
,然后针对string1
对其进行测试,从而对string2
执行此操作:
db.test.find({$where: 'RegExp(this.string1).test(this.string2)'})
但是,如果您使用的是MongoDB 3.4+,则可以使用$indexOfCP
聚合运算符更有效地执行此操作:
db.test.aggregate([
// Project the index of where string1 appears in string2, along with the original doc.
{$project: {foundIndex: {$indexOfCP: ['$string2', '$string1']}, doc: '$$ROOT'}},
// Filter out the docs where the string wasn't found
{$match: {foundIndex: {$ne: -1}}},
// Promote the original doc back to the root
{$replaceRoot: {newRoot: '$doc'}}
])
或者更直接地使用$redact
:
db.test.aggregate([
{$redact: {
$cond: {
if: { $eq: [{$indexOfCP: ['$string2', '$string1']}, -1]},
then: '$$PRUNE',
else: '$$KEEP'
}
}}
])