Javascript Mongo聚合$match等价于{$where:“this.field1!==this.field2”}
所以我有一个疑问,Javascript Mongo聚合$match等价于{$where:“this.field1!==this.field2”},javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,所以我有一个疑问, db.collection.find({$where:“this.field1!==this.field2”}) 但是现在我需要创建一个类似的查询,并将结果聚合到一个复杂的查询中,这是经过验证的,只有通过使用聚合管道或“cannon for a fly”并使用mapReduce选项才能完成 既然我想避免使用mapReduce,那么有没有一种方法可以实现类似于{$where:“this.field1!==this.field2”}的方法 一些观察结果,解决上述情况的一般方法的答
db.collection.find({$where:“this.field1!==this.field2”})
但是现在我需要创建一个类似的查询,并将结果聚合到一个复杂的查询中,这是经过验证的,只有通过使用聚合管道或“cannon for a fly”并使用mapReduce选项才能完成
既然我想避免使用mapReduce,那么有没有一种方法可以实现类似于{$where:“this.field1!==this.field2”}
的方法
一些观察结果,解决上述情况的一般方法的答案是最理想的,但如果不可能,为了解决我的问题,我还可以在查询中使用原始值,但有以下限制。我需要找到下面的内容
db.collection.find({ $or :[
{field1: value},
{field2: value}
], $and: [
{ field1: {$not: {$eq: value}}},
{ field2: {$not: {$eq: value}} }
]})
我尝试了上面的查询,但它会丢弃包含两个字段中的值的结果,我想要的是一种方法,可以同时丢弃两个字段中具有相同值的对象,但可以获得在两个字段中都具有相同值的文档,我通常更喜欢一个查询方法,但在阅读了很多之后,我认为避免mapReduce的唯一选择是
db.collection.find({$where: "this.field1 === this.field2"}, function (err, results){
var match = { $or :[
{field1: value},
{field2: value}
], {
_id : { $not : {$in: results.map((x) => x._id)}}
}
db.collection([ {$match: match}, {$project: projectionObject}, ...., etc])
})
所以我将使用上面的be解决方案,它可以进行很多优化(我只是在写问题的时候写的),但是如果可能的话,我希望避免将一个非常大的ObjectID列表发送回数据库。我将对它进行一些重构,在where语句之前使用匹配运算符,这是一个复杂的情况,也许您可以使用
$cond
内部$project
var projectDataForMatch = {
$project : {
_id : 1, //list all fields needed here
filterThisDoc : {
$cond : {
if : {
$eq : ["$field1", "$filed2"]
},
then : 1,
else : 0
} //or use compare operator $cmp
}
}
}
var match = {
$match : {
filterThisDoc : 1
}
}
db.col.aggregate([projectDataForMatch, match])
您可以根据需要扩展
$cond
,以满足您的需要。我喜欢这种方法,我会等一天,看看是否有更容易阅读的内容出现,或者我想我会接受这个答案,而且这不仅为解决这种情况提供了很大的灵活性,但是使用这个技巧可以编写很多非常复杂的查询。由于管道允许多次使用match,我可以在以前过滤很多结果,然后应用这个技巧并再次匹配以减少cond操作的工作量。@galileopy-这就是聚合的威力:-)是的,是重复的,当时我真的很努力地想找到解决办法。我该怎么办?就这样吧?接近?还是合并问题?我觉得这一个更一般,或者我可以编辑它更一般。此外,这个问题是关于如何转换直观的where('this.a$operator this.b'),而另一个问题解决了相同的问题,但它仅在$match上下文中说明。