【问题标题】:How to query for a dictionary in Mongo Document?如何在 Mongo Document 中查询字典?
【发布时间】:2016-10-18 11:44:27
【问题描述】:

我有一个文档,如下所示

这是该文档的 C# 结构

public class MetaData
{
  [BsonId]
  public ObjectId _Id { get; set; }
  [BsonElement("User")]
  public IDictionary<Int64, FirstUser> User { get; set; }
}

public class FirstUser
{
    [BsonElement("Name")]
    public String Name { get; set; }
    [BsonElement("Id")]
    public Int64 Id { get; set; }
}

这是我对该文档的 BSON 结构

/* 1 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192214"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "FirstUser",
                "_id" : NumberLong(1)
            }
        ]
    ]
}

/* 2 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192215"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "SecondUser",
                "_id" : NumberLong(2)
            }
        ]
    ]
}


/* 3 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192216"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "ThirdUser",
                "_id" : NumberLong(3)
            }
        ]
    ]
}


/* 4 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192217"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "FourthUser",
                "_id" : NumberLong(2)
            }
        ]
    ]
}

我需要所有“名称”为“FirstUser”的文件,为此我如何形成 MONGO QUERY?

【问题讨论】:

  • 您的 BSON 架构和您的类似乎不匹配...您的 BSON 似乎将“用户”作为对象数组的数组,而不仅仅是字典。
  • 我可以建议您使用聚合框架来解决它吗?如果是,我可以给你写一个答案。
  • 我已经厌倦了它的工作,但这里的问题是我无法获取超过 16 MB 的数据。有时我必须获取超过 16 MB 的数据。

标签: c# mongodb mongodb-query


【解决方案1】:

这里的问题是您的字典键是数字。通常你会使用"User.1.Name": "FirstUser" 之类的东西,但这种语法实际上还有其他作用:在User 中查找第二个元素,它有Name=FirstUser(因为索引是从零开始的)。

如果User只有一个key,可以使用"User.0.Name": "FirstUser"

【讨论】:

  • 这行得通,但这里的问题是用户可以是任何我们无法判断它总是在字典中排在第一位的地方。
  • 如果是这种情况,您能举个例子来说明您的架构吗?
【解决方案2】:

您可以使用以下命令从 mongo shell 执行此操作:

db.collection.find({'User.Name': 'FirstUser'});

或者从 c# 驱动程序中,您可以执行以下操作:

var c = await wat.FindAsync(x => x.User[0].Name == "FirstUser");
var metaData = await c.ToListAsync();

【讨论】:

  • 实际上我需要 mongo 查询,因为首先我进行查询然后我尝试获取文档。如何做到这一点
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多