EDIT2:虽然我仍在辩论这是重复的,但我确实使用链接文章中的解决方案和JohnnyHK的反馈来解决这个问题。我无法直接使用MongoDb驱动程序为C#工作,所以我通过手动构建Json并从中创建查询文档来实现代码中的过滤。
StringBuilder jsonQuery = new StringBuilder();
jsonQuery.Append("{RelevantCategories: {$not: {$elemMatch:{$nin: [");
for (int i = 0; i < categoryArray.Length; i++)
{
jsonQuery.AppendFormat("\"{0}\"", categoryArray[i]);
if (i < categoryArray.Length)
jsonQuery.Append(",");
}
jsonQuery.Append("]}}}}");
BsonDocument doc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(jsonQuery.ToString());
queryList.Add(new QueryDocument(doc));
我确信通过将for循环转换为linq语句可以使这更漂亮:)
编辑:这与Matching an array field which contains any combination of the provided array in MongoDB不完全相同。使用我在此问题中概述的逻辑,没有示例数组会返回结果。我希望与文档关联的所有类别都包含在用户首选项的类别列表中,而不仅仅是“一个或两个”,如另一个问题中所述。
我正在运行MongoDb 2.6。这就是我想要做的。
说我有以下文件
{
"_id": ObjectId("…"),
"Title": "Document 1",
"Categories": ["CAT1", "CAT2", "CAT3"]
}
{
"_id": ObjectId("…"),
"Title": "Document 2",
"Categories": ["CAT3", "CAT4", "CAT9]
}
{
"_id": ObjectId("…"),
"Title": "Document 3",
"Categories": ["CAT6"]
}
每个文档至少有1个,最多3个与之关联的类别
用户可以指定他们感兴趣的类别列表(通常大约20个左右),我希望查询只返回用户的首选类别列表中包含所有相关类别的文档。
因此,如果用户的首选项列表看起来像[“CAT2”,“CAT3”,“CAT4”,“CAT5”,“CAT9”,“CAT10”,“CAT11”,“CAT15”]只有“文档2”会得到回报。
我无法使用IN或ALL运算符执行此操作,因为您可以按照
的方式执行操作db.mydocument.find({'categories':{$ all:['CAT2','CAT3','CAT4','CAT5','CAT9','CAT10','CAT11','CAT15' ]}});
要求所有[“CAT2”,“CAT3”,“CAT4”,“CAT5”,“CAT9”,“CAT10”,“CAT11”,“CAT15”]都包含在单个文件的“类别”中这个领域与我想要的相反。
我现在不知道如何执行我需要的那种查询而无需在执行它之后编写一些应用程序级代码来过滤掉不需要的结果。
感谢您的帮助。