【发布时间】:2013-04-04 20:14:36
【问题描述】:
好的,这里发生了一些事情..我有两个集合:test 和 test1。两个集合中的文档都有一个包含一些标签的数组字段(分别为 tags 和 tags1)。我需要找到这些标签的交集 和 如果即使单个标签匹配,也从集合 test1 中获取整个文档。
> db.test.find();
{
"_id" : ObjectId("5166c19b32d001b79b32c72a"),
"tags" : [
"a",
"b",
"c"
]
}
> db.test1.find();
{
"_id" : ObjectId("5166c1c532d001b79b32c72b"),
"tags1" : [
"a",
"b",
"x",
"y"
]
}
> db.test.find().forEach(function(doc){db.test1.find({tags1:{$in:doc.tags}})});
令人惊讶的是,这并没有返回任何东西。但是,当我尝试使用单个文档时,它可以工作:
> var doc = db.test.findOne();
> db.test1.find({tags1:{$in:doc.tags}});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a", "b", "x", "y" ] }
但这是我需要的一部分。我也需要交叉口。所以我尝试了这个:
> db.test1.find({tags1:{$in:doc.tags}},{"tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a" ] }
但它只返回“a”,而“a”和“b”都是 in 标签1。位置运算符是否只返回第一个匹配项?此外,使用$in 不会完全给我一个交集。我怎样才能得到一个交集(应该返回“a”和“b”),而不管哪个数组与另一个数组进行比较。
现在说有一个运营商可以做到这一点..
> db.test1.find({tags1:{$intersection:doc.tags}},{"tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a", "b" ] }
我的要求是,我需要整个 tags1 数组加上这个交集,在同一个查询中,如下所示:
> db.test1.find({tags1:{$intersection:doc.tags}},{"tags1":1, "tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1": [ "a", "b", "x", "y" ],
"tags1" : [ "a", "b" ] }
但这是一个无效的 json。重命名键是可能的,还是只能通过聚合框架(以及跨不同的集合?)?我用$in 尝试了上述查询。但它表现得好像完全忽略了"tags:1" 投影。
PS:我将在 test1 中至少有 10k 文档,而在测试中将有很少 (
感谢您的帮助!
【问题讨论】:
-
要评论您的第一个问题,“db.test1.find({tags1:{$in:doc.tags}})”将返回一个游标。要打印到屏幕上,您应该在第二个查找中附加如下内容: .forEach(function(doc){print(tojson(doc));})
-
谢谢@JamesWahlin!我知道这很愚蠢:P 您的快速评论让我至少可以进一步寻找解决方案。
标签: mongodb mongodb-.net-driver mongodb-query