【问题标题】:RavenDB Spatial Queries Not Returning ResultsRavenDB 空间查询不返回结果
【发布时间】:2012-09-03 09:37:33
【问题描述】:

以下结果为 0,我认为不应该这样。

查询代码:

 var sourceResults = session.Advanced.LuceneQuery<Route>("Routes/BySource")
            .WithinRadiusOf(5, toMatch.Source.Location.Latitude, toMatch.Source.Location.Longitude)
            .WhereBetween(r => r.DateTime, minDateTime, maxDateTime).ToArray();

索引代码:

    /// <summary>
    /// Index for spatial search by route source.
    /// </summary>
    public class Routes_BySource : AbstractIndexCreationTask<Route>
    {
        public Routes_BySource()
        {
            Map = routes => from r in routes
                            select new { _ = SpatialIndex.Generate(r.Source.Location.Latitude, r.Source.Location.Longitude) };
        }
    }

型号:

public class Route
{       
    /// <summary>
    /// Gets or sets the id.
    /// </summary>
    /// <value>
    /// The id.
    /// </value>        
    public string Id { get; set; }

    /// <summary>
    /// Gets or sets the source.
    /// </summary>
    /// <value>
    /// From.
    /// </value>
    public Address Source { get; set; }

    /// <summary>
    /// Gets or sets destination.
    /// </summary>
    /// <value>
    /// To.
    /// </value>
    public Address Destination { get; set; }

    /// <summary>
    /// Gets or sets the id of the user who requested the route.
    /// </summary>
    /// <value>
    /// The user id.
    /// </value>
    public string UserId { get; set; }

    /// <summary>
    /// Gets or sets the date time that the request is for.
    /// </summary>
    /// <value>
    /// The date time.
    /// </value>
    public DateTime DateTime { get; set; }
}

public class Address
{
    /// <summary>
    /// Gets or sets the name. This is the formatted full name of the address.
    /// </summary>
    /// <value>
    /// The name.
    /// </value>
    public string Name { get; set; }

    /// <summary>
    /// Gets or sets the location.
    /// </summary>
    /// <value>
    /// The location.
    /// </value>
    public Location Location { get; set; }
}

public class Location
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

单元测试(调用查询代码)

        using (var session = Common.DocumentStore.OpenSession())
        {
            var routeService = new RouteService(session);
            var newRoute = new Route
            {
                Id = Guid.NewGuid().ToString(),
                DateTime = DateTime.Now,
                UserId = "user",
                Source = new Address { Name = "101 W. 79th St. NY, NY", Location = new Location { Latitude = 32, Longitude = 72 } },
                Destination = new Address { Name = "101 W. 79th St. NY, NY", Location = new Location { Latitude = 32, Longitude = 72 } }
            };
            routeService.Save(newRoute);
            var routes = routeService.Search(newRoute);
            Assert.IsTrue(routes.Any());
        }

知道我在这里做错了什么吗?看起来应该很简单......

谢谢

【问题讨论】:

  • 您传递给 WithinRadiusOf 的值是什么?
  • 单元测试的lat/long中提到的那些
  • 出于测试目的,我正在搜索刚刚保存的相同值

标签: ravendb


【解决方案1】:

在您的代码中,您有 routeService.Save(newRoute);,我习惯于看到 session.Store(newRoute);然后 session.SaveChanges();

在调用 session.SaveChanges(); 之前,不会将内容写入数据库;

但是您需要给 ravenDB 时间来索引更改。我建议使用“等待非陈旧结果”,我现在不记得代码,但如果你谷歌 ravendb 非陈旧结果。

【讨论】:

  • 你赢了!!谢谢!添加 session.Query().Customize(x => x.WaitForNonStaleResults()).ToArray();
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2021-03-18
  • 2021-11-20
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多