我是MongoDB的新手,正在尝试比较MongoDB集合中的2个字段。
字段是属性(对象)和集合(数组)
{
"_id" : ObjectId("55ae1e47309ffcbd1b67bd6c"),
"collections" : [
{
"collection_code" : "9TEST",
"_id" : ObjectId("5c76eee4bb4afe3a3603eeb3")
}
],
"attributes" : {
"collection_code" : "9TEST"
}
}
我的查询是
db.companies.find({ $where : "this.attributes.collection_code == this.collections[collection_code]" })
遇到错误
{
"message" : "TypeError: Cannot read property 'collection_code' of undefined" +
"at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
"$err" : "TypeError: Cannot read property 'collection_code' of undefined" +
"at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
"code" : 16722,
"name" : "MongoError"
}
我们非常感谢您的帮助。预先感谢。
答案 0 :(得分:1)
您需要一个$expr来比较MongoDB中的两个字段。由于您有一个数组(collection
,并且要检查是否存在字段匹配的任何元素,因此可以将$map与$anyElementTrue运算符一起使用,如下所示:
db.col.find({
$expr: {
$anyElementTrue: {
$map: {
input: "$collections",
in: {
$eq: [ "$$this.collection_code", "$attributes.collection_code" ]
}
}
}
}
})
使用$in运算符还有更简洁的方式
db.col.find({
$expr: {
$in: [ "$attributes.collection_code", "$collections.collection_code" ]
}
})
之所以有效,是因为collections.collection_code
在这种情况下代表字符串数组。
编辑:
作为3.0版本的解决方法,您可以将$anyElementTrue
与$redact结合使用:
db.col.aggregate([
{ $redact: {
$cond: {
if: {$anyElementTrue: { $map: { input: "$collections", as: "c", in: { $eq: [ "$$c.collection_code", "$attributes.collection_code" ] } }}},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}
])